Spaces:
Sleeping
Sleeping
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 |
-
|
| 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 |
-
|
| 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 |
-
|
| 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 |
-
|
| 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:
|
| 100 |
border-right: none;
|
| 101 |
border-bottom: 1px solid var(--border-primary);
|
| 102 |
}
|
| 103 |
.content {
|
| 104 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
}
|