claude-relay 2.2.3 → 2.3.0

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.
@@ -34,6 +34,8 @@
34
34
 
35
35
  /* --- File panel header --- */
36
36
  #file-panel-header {
37
+ display: flex;
38
+ align-items: center;
37
39
  padding: 4px 8px;
38
40
  }
39
41
 
@@ -50,12 +52,33 @@
50
52
  font-size: 14px;
51
53
  font-weight: 400;
52
54
  cursor: pointer;
55
+ flex: 1;
53
56
  transition: background 0.15s, color 0.15s;
54
57
  }
55
58
 
56
59
  #file-panel-back .lucide { width: 16px; height: 16px; flex-shrink: 0; }
57
60
  #file-panel-back:hover { background: var(--sidebar-hover); color: var(--text); }
58
61
 
62
+ #file-panel-refresh {
63
+ display: flex;
64
+ align-items: center;
65
+ justify-content: center;
66
+ width: 32px;
67
+ height: 32px;
68
+ border-radius: 8px;
69
+ border: none;
70
+ background: transparent;
71
+ color: var(--text-muted);
72
+ cursor: pointer;
73
+ flex-shrink: 0;
74
+ transition: background 0.15s, color 0.15s, transform 0.3s;
75
+ }
76
+
77
+ #file-panel-refresh .lucide { width: 14px; height: 14px; }
78
+ #file-panel-refresh:hover { background: var(--sidebar-hover); color: var(--text); }
79
+ #file-panel-refresh.spinning { animation: spin-once 0.5s ease; }
80
+ @keyframes spin-once { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
81
+
59
82
  /* --- File tree --- */
60
83
  #file-tree { padding: 4px 8px; }
61
84
 
@@ -136,8 +159,13 @@
136
159
  flex-direction: column;
137
160
  overflow: hidden;
138
161
  flex-shrink: 0;
162
+ transition: max-width 0.2s ease, width 0.2s ease;
139
163
  }
140
164
  #file-viewer.hidden { display: none; }
165
+ #file-viewer.file-viewer-wide {
166
+ width: 70%;
167
+ max-width: 1200px;
168
+ }
141
169
  }
142
170
 
143
171
  /* Narrow screens: full overlay */
@@ -298,6 +326,57 @@
298
326
  line-height: inherit;
299
327
  }
300
328
 
329
+ /* Code with line numbers */
330
+ .file-viewer-code {
331
+ display: flex;
332
+ min-height: 0;
333
+ }
334
+
335
+ .file-viewer-code pre {
336
+ margin: 0;
337
+ font-family: "SF Mono", Menlo, Monaco, monospace;
338
+ font-size: 13px;
339
+ line-height: 1.55;
340
+ white-space: pre;
341
+ word-break: normal;
342
+ }
343
+
344
+ .file-viewer-gutter {
345
+ flex-shrink: 0;
346
+ padding: 12px 10px 12px 14px;
347
+ text-align: right;
348
+ color: var(--text-dimmer);
349
+ opacity: 0.5;
350
+ user-select: none;
351
+ -webkit-user-select: none;
352
+ border-right: 1px solid var(--border-subtle);
353
+ min-width: 44px;
354
+ position: sticky;
355
+ left: 0;
356
+ background: var(--bg);
357
+ z-index: 1;
358
+ }
359
+
360
+ .file-viewer-code-content {
361
+ flex: 1;
362
+ padding: 12px 14px;
363
+ min-width: 0;
364
+ }
365
+
366
+ .file-viewer-code-content code {
367
+ font-family: inherit;
368
+ font-size: inherit;
369
+ line-height: inherit;
370
+ background: none;
371
+ padding: 0;
372
+ border-radius: 0;
373
+ }
374
+
375
+ .file-viewer-code-content .hljs {
376
+ background: transparent;
377
+ padding: 0;
378
+ }
379
+
301
380
  .file-viewer-binary {
302
381
  display: flex;
303
382
  align-items: center;
@@ -518,3 +597,465 @@
518
597
  color: var(--text-dimmer);
519
598
  font-style: italic;
520
599
  }
600
+
601
+ /* --- File Edit History --- */
602
+
603
+ .file-history-panel {
604
+ padding: 16px 20px;
605
+ height: 100%;
606
+ overflow-y: auto;
607
+ }
608
+
609
+ .file-history-header {
610
+ display: flex;
611
+ align-items: center;
612
+ justify-content: space-between;
613
+ font-size: 13px;
614
+ font-weight: 600;
615
+ color: var(--text-secondary);
616
+ margin-bottom: 12px;
617
+ padding-bottom: 8px;
618
+ border-bottom: 1px solid var(--border-subtle);
619
+ }
620
+
621
+ .file-history-list {
622
+ display: flex;
623
+ flex-direction: column;
624
+ gap: 10px;
625
+ }
626
+
627
+ .file-history-entry {
628
+ background: var(--bg-alt);
629
+ border: 1px solid var(--border);
630
+ border-radius: 10px;
631
+ padding: 10px 12px;
632
+ cursor: pointer;
633
+ transition: border-color 0.15s, background 0.15s;
634
+ position: relative;
635
+ }
636
+
637
+ .file-history-entry:hover { border-color: var(--accent); }
638
+ .file-history-entry.no-navigate { cursor: default; opacity: 0.7; }
639
+ .file-history-entry.no-navigate:hover { border-color: var(--border); }
640
+
641
+ .file-history-entry.selected {
642
+ border-color: var(--accent);
643
+ background: var(--accent-bg);
644
+ }
645
+
646
+ .file-history-entry.selected::before {
647
+ content: attr(data-select-num);
648
+ position: absolute;
649
+ top: -6px;
650
+ left: -6px;
651
+ width: 18px;
652
+ height: 18px;
653
+ border-radius: 50%;
654
+ background: var(--accent);
655
+ color: #fff;
656
+ font-size: 11px;
657
+ font-weight: 600;
658
+ display: flex;
659
+ align-items: center;
660
+ justify-content: center;
661
+ }
662
+
663
+ .file-history-entry.git-entry {
664
+ border-left: 3px solid var(--text-dimmer);
665
+ }
666
+
667
+ .file-history-entry.git-entry.selected {
668
+ border-left-color: var(--accent);
669
+ }
670
+
671
+ .file-history-entry-header {
672
+ display: flex;
673
+ justify-content: space-between;
674
+ align-items: center;
675
+ gap: 8px;
676
+ }
677
+
678
+ .file-history-title {
679
+ font-size: 13px;
680
+ font-weight: 500;
681
+ color: var(--text);
682
+ overflow: hidden;
683
+ text-overflow: ellipsis;
684
+ white-space: nowrap;
685
+ min-width: 0;
686
+ flex: 1;
687
+ }
688
+
689
+ .file-history-badge {
690
+ font-size: 11px;
691
+ font-weight: 500;
692
+ padding: 2px 8px;
693
+ border-radius: 10px;
694
+ background: var(--accent-bg);
695
+ color: var(--accent);
696
+ flex-shrink: 0;
697
+ }
698
+
699
+ .file-history-badge.badge-commit {
700
+ background: rgba(255,255,255,0.06);
701
+ color: var(--text-muted);
702
+ }
703
+
704
+ .file-history-code-subtitle {
705
+ font-family: "SF Mono", Menlo, Monaco, monospace;
706
+ font-size: 11px;
707
+ color: var(--text-muted);
708
+ margin-top: 4px;
709
+ padding: 2px 6px;
710
+ background: rgba(255, 255, 255, 0.04);
711
+ border-radius: 3px;
712
+ overflow: hidden;
713
+ text-overflow: ellipsis;
714
+ white-space: nowrap;
715
+ }
716
+
717
+ .file-history-meta {
718
+ font-size: 11px;
719
+ color: var(--text-dimmer);
720
+ margin-top: 4px;
721
+ overflow: hidden;
722
+ text-overflow: ellipsis;
723
+ white-space: nowrap;
724
+ }
725
+
726
+ /* Inline diff preview */
727
+ .file-history-diff {
728
+ max-height: 200px;
729
+ overflow: auto;
730
+ border-radius: 6px;
731
+ background: var(--code-bg);
732
+ margin-top: 8px;
733
+ }
734
+
735
+ .file-history-write-badge {
736
+ padding: 8px 10px;
737
+ font-size: 12px;
738
+ color: var(--text-muted);
739
+ font-style: italic;
740
+ text-align: center;
741
+ }
742
+
743
+ /* Action buttons row */
744
+ .file-history-actions {
745
+ display: flex;
746
+ gap: 6px;
747
+ margin-top: 8px;
748
+ }
749
+
750
+ .file-history-action-btn {
751
+ padding: 3px 8px;
752
+ border-radius: 4px;
753
+ border: 1px solid var(--border);
754
+ background: transparent;
755
+ color: var(--text-muted);
756
+ font-size: 11px;
757
+ font-family: inherit;
758
+ cursor: pointer;
759
+ transition: background 0.15s, color 0.15s, border-color 0.15s;
760
+ }
761
+
762
+ .file-history-action-btn:hover {
763
+ background: var(--sidebar-hover);
764
+ color: var(--text);
765
+ border-color: var(--text-dimmer);
766
+ }
767
+
768
+ .file-history-nav-btn {
769
+ color: var(--accent);
770
+ border-color: transparent;
771
+ }
772
+
773
+ .file-history-nav-btn:hover {
774
+ background: var(--accent-bg);
775
+ color: var(--accent);
776
+ border-color: var(--accent);
777
+ }
778
+
779
+ /* Compare bar */
780
+ .file-history-compare-bar-slots {
781
+ padding: 10px 12px;
782
+ margin-bottom: 8px;
783
+ border-radius: 8px;
784
+ background: rgba(255, 255, 255, 0.04);
785
+ border: 1px solid var(--border);
786
+ }
787
+
788
+ .compare-bar-label {
789
+ display: flex;
790
+ align-items: center;
791
+ gap: 5px;
792
+ font-size: 11px;
793
+ font-weight: 600;
794
+ color: var(--text-secondary);
795
+ margin-bottom: 8px;
796
+ text-transform: uppercase;
797
+ letter-spacing: 0.5px;
798
+ }
799
+
800
+ .compare-bar-label svg {
801
+ width: 13px;
802
+ height: 13px;
803
+ opacity: 0.7;
804
+ }
805
+
806
+ .compare-slots-row {
807
+ display: flex;
808
+ align-items: center;
809
+ gap: 8px;
810
+ }
811
+
812
+ .file-history-compare-slot {
813
+ display: flex;
814
+ align-items: center;
815
+ gap: 6px;
816
+ flex: 1;
817
+ min-width: 0;
818
+ padding: 7px 10px;
819
+ border: 1.5px dashed rgba(255, 255, 255, 0.15);
820
+ border-radius: 6px;
821
+ font-size: 11px;
822
+ color: var(--text-muted);
823
+ background: rgba(255, 255, 255, 0.02);
824
+ transition: border-color 0.15s, background 0.15s;
825
+ }
826
+
827
+ .file-history-compare-slot.filled {
828
+ border-style: solid;
829
+ border-color: var(--accent);
830
+ background: var(--accent-bg);
831
+ color: var(--text-secondary);
832
+ }
833
+
834
+ .compare-slot-num {
835
+ display: flex;
836
+ align-items: center;
837
+ justify-content: center;
838
+ width: 18px;
839
+ height: 18px;
840
+ border-radius: 4px;
841
+ font-size: 10px;
842
+ font-weight: 700;
843
+ flex-shrink: 0;
844
+ background: rgba(255, 255, 255, 0.1);
845
+ color: var(--text-muted);
846
+ }
847
+
848
+ .file-history-compare-slot.filled .compare-slot-num {
849
+ background: var(--accent);
850
+ color: #fff;
851
+ }
852
+
853
+ .compare-slot-text {
854
+ flex: 1;
855
+ min-width: 0;
856
+ overflow: hidden;
857
+ text-overflow: ellipsis;
858
+ white-space: nowrap;
859
+ font-family: "SF Mono", Menlo, Monaco, monospace;
860
+ font-size: 11px;
861
+ }
862
+
863
+ .compare-slot-placeholder {
864
+ font-style: italic;
865
+ opacity: 0.6;
866
+ }
867
+
868
+ .compare-slot-clear {
869
+ flex-shrink: 0;
870
+ border: none;
871
+ background: none;
872
+ color: var(--text-dimmer);
873
+ font-size: 14px;
874
+ cursor: pointer;
875
+ padding: 0 2px;
876
+ line-height: 1;
877
+ }
878
+ .compare-slot-clear:hover { color: var(--text); }
879
+
880
+ .compare-slot-arrow {
881
+ flex-shrink: 0;
882
+ color: var(--text-dimmer);
883
+ opacity: 0.5;
884
+ }
885
+
886
+ .compare-slot-arrow svg {
887
+ width: 14px;
888
+ height: 14px;
889
+ }
890
+
891
+ /* Compare button */
892
+ .file-history-compare-btn {
893
+ display: flex;
894
+ align-items: center;
895
+ gap: 5px;
896
+ padding: 7px 14px;
897
+ border-radius: 6px;
898
+ border: none;
899
+ background: var(--accent);
900
+ color: #fff;
901
+ font-size: 12px;
902
+ font-weight: 500;
903
+ cursor: pointer;
904
+ font-family: inherit;
905
+ flex-shrink: 0;
906
+ transition: opacity 0.15s;
907
+ }
908
+
909
+ .file-history-compare-btn svg {
910
+ width: 13px;
911
+ height: 13px;
912
+ }
913
+
914
+ .file-history-compare-btn:hover { opacity: 0.85; }
915
+
916
+ /* Compare view */
917
+ .file-history-compare-bar {
918
+ margin-bottom: 12px;
919
+ }
920
+
921
+ .file-history-compare-back {
922
+ padding: 6px 12px;
923
+ border-radius: 6px;
924
+ border: 1px solid var(--border);
925
+ background: transparent;
926
+ color: var(--text-secondary);
927
+ font-size: 12px;
928
+ cursor: pointer;
929
+ font-family: inherit;
930
+ transition: background 0.15s, color 0.15s;
931
+ }
932
+
933
+ .file-history-compare-back:hover { background: var(--sidebar-hover); color: var(--text); }
934
+
935
+ /* View file bar (back + toggle) */
936
+ .file-history-view-bar {
937
+ display: flex;
938
+ align-items: center;
939
+ justify-content: space-between;
940
+ padding: 10px 16px;
941
+ flex-shrink: 0;
942
+ }
943
+
944
+ .file-history-view-toggle {
945
+ display: flex;
946
+ border: 1px solid var(--border);
947
+ border-radius: 6px;
948
+ overflow: hidden;
949
+ }
950
+
951
+ .file-history-toggle-btn {
952
+ padding: 4px 10px;
953
+ border: none;
954
+ background: transparent;
955
+ color: var(--text-muted);
956
+ font-size: 11px;
957
+ font-family: inherit;
958
+ cursor: pointer;
959
+ transition: background 0.15s, color 0.15s;
960
+ }
961
+
962
+ .file-history-toggle-btn + .file-history-toggle-btn {
963
+ border-left: 1px solid var(--border);
964
+ }
965
+
966
+ .file-history-toggle-btn:hover {
967
+ background: var(--sidebar-hover);
968
+ color: var(--text);
969
+ }
970
+
971
+ .file-history-toggle-btn.active {
972
+ background: var(--accent-bg);
973
+ color: var(--accent);
974
+ }
975
+
976
+ /* Full-size diff container (View diff mode) */
977
+ .file-history-diff-full {
978
+ flex: 1;
979
+ overflow: auto;
980
+ background: var(--code-bg);
981
+ border-top: 1px solid var(--border-subtle);
982
+ }
983
+
984
+ /* Split view */
985
+ .file-history-compare-view {
986
+ display: flex;
987
+ flex-direction: column;
988
+ height: 100%;
989
+ }
990
+
991
+ .file-history-compare-view .file-history-compare-bar {
992
+ padding: 10px 16px;
993
+ flex-shrink: 0;
994
+ }
995
+
996
+ .file-history-compare-content {
997
+ display: flex;
998
+ flex-direction: column;
999
+ flex: 1;
1000
+ min-height: 0;
1001
+ }
1002
+
1003
+ .file-history-split {
1004
+ display: flex;
1005
+ flex: 1;
1006
+ min-height: 0;
1007
+ border-top: 1px solid var(--border-subtle);
1008
+ }
1009
+
1010
+ .file-history-split-pane {
1011
+ flex: 1;
1012
+ min-width: 0;
1013
+ display: flex;
1014
+ flex-direction: column;
1015
+ }
1016
+
1017
+ .file-history-split-pane + .file-history-split-pane {
1018
+ border-left: 1px solid var(--border-subtle);
1019
+ }
1020
+
1021
+ .file-history-split-label {
1022
+ padding: 6px 12px;
1023
+ font-size: 11px;
1024
+ font-weight: 600;
1025
+ color: var(--text-muted);
1026
+ background: var(--bg-alt);
1027
+ border-bottom: 1px solid var(--border-subtle);
1028
+ overflow: hidden;
1029
+ text-overflow: ellipsis;
1030
+ white-space: nowrap;
1031
+ flex-shrink: 0;
1032
+ }
1033
+
1034
+ .file-history-split-code {
1035
+ flex: 1;
1036
+ overflow: auto;
1037
+ background: var(--code-bg);
1038
+ }
1039
+
1040
+ .file-history-split-code pre {
1041
+ margin: 0;
1042
+ padding: 8px 12px;
1043
+ font-size: 12px;
1044
+ line-height: 1.5;
1045
+ tab-size: 2;
1046
+ }
1047
+
1048
+ .file-history-split-code code {
1049
+ font-family: "SF Mono", Menlo, Monaco, monospace;
1050
+ }
1051
+
1052
+ /* --- Message blink animation --- */
1053
+ @keyframes message-blink {
1054
+ 0%, 100% { background: transparent; }
1055
+ 50% { background: var(--accent-bg); }
1056
+ }
1057
+
1058
+ .message-blink {
1059
+ animation: message-blink 0.5s ease 3;
1060
+ border-radius: 12px;
1061
+ }
@@ -172,6 +172,7 @@
172
172
  object-fit: cover;
173
173
  border-radius: 8px;
174
174
  border: 1px solid var(--border-subtle);
175
+ cursor: pointer;
175
176
  }
176
177
 
177
178
  .image-preview-remove {
@@ -419,23 +419,34 @@
419
419
  .model-menu-item:hover { background: rgba(255,255,255,0.05); color: var(--text); }
420
420
  .model-menu-item.active { color: var(--accent); font-weight: 600; }
421
421
 
422
- /* --- Usage panel --- */
423
- #usage-panel {
422
+ /* --- Info panels container --- */
423
+ #info-panels {
424
424
  position: fixed;
425
425
  top: 80px;
426
426
  right: 16px;
427
427
  width: 280px;
428
428
  max-height: calc(100vh - 160px);
429
429
  overflow-y: auto;
430
+ z-index: 50;
431
+ display: flex;
432
+ flex-direction: column;
433
+ gap: 8px;
434
+ pointer-events: none;
435
+ }
436
+
437
+ #info-panels:empty { display: none; }
438
+
439
+ /* --- Usage panel --- */
440
+ #usage-panel, #status-panel, #context-panel {
430
441
  background: var(--bg-alt);
431
442
  border: 1px solid var(--border);
432
443
  border-radius: 12px;
433
444
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
434
- z-index: 50;
435
445
  font-size: 12px;
446
+ pointer-events: auto;
436
447
  }
437
448
 
438
- #usage-panel.hidden { display: none; }
449
+ #usage-panel.hidden, #status-panel.hidden, #context-panel.hidden { display: none; }
439
450
 
440
451
  .usage-panel-header {
441
452
  display: flex;
@@ -448,6 +459,11 @@
448
459
  color: var(--text);
449
460
  }
450
461
 
462
+ .usage-panel-actions {
463
+ display: flex;
464
+ gap: 2px;
465
+ }
466
+
451
467
  .usage-panel-header button {
452
468
  display: flex;
453
469
  align-items: center;
@@ -523,8 +539,76 @@
523
539
  font-weight: 500;
524
540
  }
525
541
 
542
+ /* --- Context bar --- */
543
+ .context-bar-wrap {
544
+ display: flex;
545
+ align-items: center;
546
+ gap: 8px;
547
+ margin: 6px 0 8px;
548
+ }
549
+ .context-bar {
550
+ flex: 1;
551
+ height: 6px;
552
+ background: var(--border);
553
+ border-radius: 3px;
554
+ overflow: hidden;
555
+ }
556
+ .context-bar-fill {
557
+ height: 100%;
558
+ width: 0%;
559
+ background: var(--success);
560
+ border-radius: 3px;
561
+ transition: width 0.3s ease, background 0.3s ease;
562
+ }
563
+ .context-bar-fill.warn { background: #E5A84B; }
564
+ .context-bar-fill.danger { background: var(--error); }
565
+ .context-bar-pct {
566
+ font-family: "SF Mono", Menlo, Monaco, monospace;
567
+ font-size: 11px;
568
+ font-weight: 600;
569
+ color: var(--text-secondary);
570
+ min-width: 32px;
571
+ text-align: right;
572
+ }
573
+
574
+ /* --- Context mini bar (in input area) --- */
575
+ #context-mini {
576
+ display: flex;
577
+ align-items: center;
578
+ gap: 8px;
579
+ padding: 6px 14px 2px;
580
+ cursor: pointer;
581
+ transition: opacity 0.15s;
582
+ }
583
+ #context-mini:hover { opacity: 0.8; }
584
+ #context-mini.hidden { display: none; }
585
+ .context-mini-bar {
586
+ flex: 1;
587
+ height: 4px;
588
+ background: var(--border);
589
+ border-radius: 2px;
590
+ overflow: hidden;
591
+ }
592
+ .context-mini-fill {
593
+ height: 100%;
594
+ width: 0%;
595
+ border-radius: 2px;
596
+ background: var(--success);
597
+ transition: width 0.3s ease, background 0.3s ease;
598
+ }
599
+ .context-mini-fill.warn { background: #E5A84B; }
600
+ .context-mini-fill.danger { background: var(--error); }
601
+ .context-mini-label {
602
+ font-family: "SF Mono", Menlo, Monaco, monospace;
603
+ font-size: 10px;
604
+ font-weight: 600;
605
+ color: var(--text-dimmer);
606
+ min-width: 24px;
607
+ text-align: right;
608
+ }
609
+
526
610
  @media (max-width: 768px) {
527
- #usage-panel {
611
+ #info-panels {
528
612
  top: auto;
529
613
  bottom: calc(var(--safe-bottom, 0px) + 64px);
530
614
  right: 12px;