NeonClary commited on
Commit
936b89e
Β·
1 Parent(s): d57958f

Add responsive design for phone and tablet screens

Browse files
frontend/src/components/DevMenu.js CHANGED
@@ -82,6 +82,12 @@ export default function DevMenu({
82
  >
83
  Freeform persona input
84
  </button>
 
 
 
 
 
 
85
  <button disabled={!hasApiLog} onClick={() => { onDownloadApiLog(); setOpen(false); }}>
86
  Download full API history
87
  </button>
 
82
  >
83
  Freeform persona input
84
  </button>
85
+ <button disabled={!hasChat} className="dev-panel-download-item" onClick={() => { onDownloadChatTxt(); setOpen(false); }}>
86
+ Download chat as .txt
87
+ </button>
88
+ <button disabled={!hasChat} className="dev-panel-download-item" onClick={() => { onDownloadChatMd(); setOpen(false); }}>
89
+ Download chat as .md
90
+ </button>
91
  <button disabled={!hasApiLog} onClick={() => { onDownloadApiLog(); setOpen(false); }}>
92
  Download full API history
93
  </button>
frontend/src/styles/components.css CHANGED
@@ -312,11 +312,7 @@
312
  resize: vertical;
313
  }
314
 
315
- @media (max-width: 900px) {
316
- .persona-panels {
317
- grid-template-columns: 1fr;
318
- }
319
- }
320
 
321
  /* ── Chat Area ─────────────────────────────────────────────────── */
322
 
@@ -386,12 +382,14 @@
386
  }
387
 
388
  .message-bubble {
389
- max-width: 520px;
390
  padding: 12px 16px;
391
  border-radius: 16px;
392
  font-size: 14px;
393
  line-height: 1.6;
394
  box-shadow: var(--shadow-sm);
 
 
395
  }
396
 
397
  .message-bubble.bubble-a {
@@ -647,6 +645,10 @@
647
  font-style: italic;
648
  }
649
 
 
 
 
 
650
 
651
  /* ── Orchestrator sub-menu ─────────────────────────────────────── */
652
 
@@ -776,15 +778,7 @@
776
  color: var(--text-muted);
777
  }
778
 
779
- @media (max-width: 600px) {
780
- .dev-sub-panel {
781
- right: 0;
782
- top: 100%;
783
- margin-right: 0;
784
- margin-top: 4px;
785
- width: 260px;
786
- }
787
- }
788
 
789
  /* ── Status / Loading ──────────────────────────────────────────── */
790
 
@@ -867,3 +861,158 @@
867
  .auth-login:hover {
868
  color: var(--text-primary);
869
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
312
  resize: vertical;
313
  }
314
 
315
+ /* responsive rules consolidated below */
 
 
 
 
316
 
317
  /* ── Chat Area ─────────────────────────────────────────────────── */
318
 
 
382
  }
383
 
384
  .message-bubble {
385
+ max-width: min(520px, 85%);
386
  padding: 12px 16px;
387
  border-radius: 16px;
388
  font-size: 14px;
389
  line-height: 1.6;
390
  box-shadow: var(--shadow-sm);
391
+ overflow-wrap: break-word;
392
+ word-break: break-word;
393
  }
394
 
395
  .message-bubble.bubble-a {
 
645
  font-style: italic;
646
  }
647
 
648
+ .dev-panel-download-item {
649
+ display: none !important;
650
+ }
651
+
652
 
653
  /* ── Orchestrator sub-menu ─────────────────────────────────────── */
654
 
 
778
  color: var(--text-muted);
779
  }
780
 
781
+ /* responsive rules consolidated below */
 
 
 
 
 
 
 
 
782
 
783
  /* ── Status / Loading ──────────────────────────────────────────── */
784
 
 
861
  .auth-login:hover {
862
  color: var(--text-primary);
863
  }
864
+
865
+ /* ══════════════════════════════════════════════════════════════════
866
+ RESPONSIVE BREAKPOINTS
867
+ ══════════════════════════════════════════════════════════════════ */
868
+
869
+ /* ── Tablet (<900px) ──────────────────────────────────────────── */
870
+ @media (max-width: 900px) {
871
+ .persona-panels {
872
+ grid-template-columns: 1fr;
873
+ }
874
+ .persona-field textarea {
875
+ min-height: 60px;
876
+ }
877
+ .persona-field textarea.tall {
878
+ min-height: 80px;
879
+ }
880
+ .freeform-textarea {
881
+ min-height: 160px;
882
+ }
883
+ .accordion-header {
884
+ padding: 12px 16px;
885
+ font-size: 14px;
886
+ }
887
+ .accordion-body.open {
888
+ padding: 12px 16px 16px;
889
+ }
890
+ .chat-controls {
891
+ flex-wrap: wrap;
892
+ gap: 8px;
893
+ }
894
+ .chat-controls input {
895
+ flex-basis: 100%;
896
+ font-size: 13px;
897
+ }
898
+ .message-row {
899
+ gap: 8px;
900
+ }
901
+ .avatar {
902
+ width: 32px;
903
+ height: 32px;
904
+ font-size: 12px;
905
+ }
906
+ }
907
+
908
+ /* ── Small tablet / large phone (<600px) ──────────────────────── */
909
+ @media (max-width: 600px) {
910
+ .dev-download-btns {
911
+ display: none;
912
+ }
913
+ .dev-panel-download-item {
914
+ display: block !important;
915
+ }
916
+ .dev-sub-panel {
917
+ right: 0;
918
+ top: 100%;
919
+ margin-right: 0;
920
+ margin-top: 4px;
921
+ width: min(280px, calc(100vw - 24px));
922
+ }
923
+ .dev-panel {
924
+ min-width: 200px;
925
+ }
926
+ .auth-badge {
927
+ font-size: 11px;
928
+ padding: 3px 6px;
929
+ gap: 4px;
930
+ }
931
+ .auth-remaining {
932
+ display: none;
933
+ }
934
+ }
935
+
936
+ /* ── Phone (<480px) ───────────────────────────────────────────── */
937
+ @media (max-width: 480px) {
938
+ .persona-panels {
939
+ gap: 12px;
940
+ }
941
+ .persona-panel {
942
+ gap: 8px;
943
+ }
944
+ .persona-panel-header {
945
+ font-size: 13px;
946
+ padding-bottom: 6px;
947
+ }
948
+ .persona-field label {
949
+ font-size: 11px;
950
+ }
951
+ .persona-field input,
952
+ .persona-field textarea {
953
+ padding: 8px 10px;
954
+ font-size: 12px;
955
+ }
956
+ .persona-field textarea {
957
+ min-height: 50px;
958
+ }
959
+ .persona-field textarea.tall {
960
+ min-height: 60px;
961
+ }
962
+ .freeform-textarea {
963
+ min-height: 120px;
964
+ }
965
+ .accordion {
966
+ border-radius: 8px;
967
+ margin-bottom: 10px;
968
+ }
969
+ .accordion-header {
970
+ padding: 10px 12px;
971
+ font-size: 13px;
972
+ }
973
+ .accordion-body.open {
974
+ padding: 10px 12px 14px;
975
+ }
976
+ .chat-controls {
977
+ gap: 6px;
978
+ padding: 8px 0;
979
+ }
980
+ .btn-primary,
981
+ .btn-secondary,
982
+ .btn-stop {
983
+ padding: 8px 14px;
984
+ font-size: 13px;
985
+ }
986
+ .message-bubble {
987
+ padding: 10px 12px;
988
+ font-size: 13px;
989
+ border-radius: 12px;
990
+ }
991
+ .message-row {
992
+ gap: 6px;
993
+ margin-bottom: 6px;
994
+ }
995
+ .avatar {
996
+ width: 28px;
997
+ height: 28px;
998
+ font-size: 11px;
999
+ }
1000
+ .system-message {
1001
+ font-size: 13px;
1002
+ padding: 8px;
1003
+ }
1004
+ .system-message.end-of-chat {
1005
+ font-size: 14px;
1006
+ padding: 14px;
1007
+ }
1008
+ .btn-sm {
1009
+ padding: 5px 8px;
1010
+ font-size: 11px;
1011
+ }
1012
+ .btn-ghost {
1013
+ font-size: 12px;
1014
+ }
1015
+ .auth-badge {
1016
+ display: none;
1017
+ }
1018
+ }
frontend/src/styles/layout.css CHANGED
@@ -1,7 +1,8 @@
1
  .app {
2
- min-height: 100vh;
3
  display: flex;
4
  flex-direction: column;
 
5
  }
6
 
7
  .app-header {
@@ -12,8 +13,7 @@
12
  background: var(--card-bg);
13
  border-bottom: 1px solid var(--border-primary);
14
  box-shadow: var(--shadow-sm);
15
- position: sticky;
16
- top: 0;
17
  z-index: 100;
18
  backdrop-filter: blur(12px);
19
  }
@@ -22,6 +22,7 @@
22
  display: flex;
23
  align-items: center;
24
  gap: 10px;
 
25
  }
26
 
27
  .app-title {
@@ -31,12 +32,14 @@
31
  -webkit-background-clip: text;
32
  -webkit-text-fill-color: transparent;
33
  background-clip: text;
 
34
  }
35
 
36
  .header-right {
37
  display: flex;
38
  align-items: center;
39
  gap: 8px;
 
40
  }
41
 
42
  .icon-btn {
@@ -61,6 +64,7 @@
61
  .app-main {
62
  display: flex;
63
  flex: 1;
 
64
  overflow: hidden;
65
  }
66
 
@@ -76,31 +80,67 @@
76
  display: flex;
77
  flex-direction: column;
78
  gap: 8px;
79
- max-height: calc(100vh - 57px);
80
  }
81
 
82
  .content {
83
  flex: 1;
 
84
  padding: 20px 24px;
85
  overflow-y: auto;
86
- max-height: calc(100vh - 57px);
87
  display: flex;
88
  flex-direction: column;
89
  gap: 0;
90
  }
91
 
 
92
  @media (max-width: 900px) {
 
 
 
 
 
 
 
 
93
  .app-main {
94
  flex-direction: column;
 
95
  }
96
  .sidebar {
97
  width: 100%;
98
  min-width: auto;
99
- max-height: none;
100
  border-right: none;
101
  border-bottom: 1px solid var(--border-primary);
102
  }
103
  .content {
104
- max-height: none;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
105
  }
106
  }
 
1
  .app {
2
+ height: 100vh;
3
  display: flex;
4
  flex-direction: column;
5
+ overflow: hidden;
6
  }
7
 
8
  .app-header {
 
13
  background: var(--card-bg);
14
  border-bottom: 1px solid var(--border-primary);
15
  box-shadow: var(--shadow-sm);
16
+ flex-shrink: 0;
 
17
  z-index: 100;
18
  backdrop-filter: blur(12px);
19
  }
 
22
  display: flex;
23
  align-items: center;
24
  gap: 10px;
25
+ min-width: 0;
26
  }
27
 
28
  .app-title {
 
32
  -webkit-background-clip: text;
33
  -webkit-text-fill-color: transparent;
34
  background-clip: text;
35
+ white-space: nowrap;
36
  }
37
 
38
  .header-right {
39
  display: flex;
40
  align-items: center;
41
  gap: 8px;
42
+ flex-shrink: 0;
43
  }
44
 
45
  .icon-btn {
 
64
  .app-main {
65
  display: flex;
66
  flex: 1;
67
+ min-height: 0;
68
  overflow: hidden;
69
  }
70
 
 
80
  display: flex;
81
  flex-direction: column;
82
  gap: 8px;
 
83
  }
84
 
85
  .content {
86
  flex: 1;
87
+ min-height: 0;
88
  padding: 20px 24px;
89
  overflow-y: auto;
 
90
  display: flex;
91
  flex-direction: column;
92
  gap: 0;
93
  }
94
 
95
+ /* ── Tablet: stack sidebar above content ──────────────────────── */
96
  @media (max-width: 900px) {
97
+ .app {
98
+ height: auto;
99
+ min-height: 100vh;
100
+ overflow: auto;
101
+ }
102
+ .app-header {
103
+ padding: 10px 16px;
104
+ }
105
  .app-main {
106
  flex-direction: column;
107
+ overflow: visible;
108
  }
109
  .sidebar {
110
  width: 100%;
111
  min-width: auto;
112
+ max-height: 200px;
113
  border-right: none;
114
  border-bottom: 1px solid var(--border-primary);
115
  }
116
  .content {
117
+ padding: 16px;
118
+ min-height: 0;
119
+ flex: 1;
120
+ }
121
+ }
122
+
123
+ /* ── Phone ────────────────────────────────────────────────────── */
124
+ @media (max-width: 480px) {
125
+ .app-header {
126
+ padding: 8px 12px;
127
+ gap: 4px;
128
+ }
129
+ .app-title {
130
+ font-size: 15px;
131
+ }
132
+ .header-right {
133
+ gap: 4px;
134
+ }
135
+ .icon-btn {
136
+ width: 32px;
137
+ height: 32px;
138
+ }
139
+ .sidebar {
140
+ max-height: 160px;
141
+ padding: 8px;
142
+ }
143
+ .content {
144
+ padding: 12px;
145
  }
146
  }