|
985 | 985 |
|
986 | 986 | @keyframes fade-in { from { opacity: 0; transform: translateY(3px); } to { opacity: 1; transform: translateY(0); } } |
987 | 987 | @media (max-width: 700px) { |
| 988 | + /* ── Header ── */ |
| 989 | + .header { padding: 0 8px; height: 36px; min-height: 36px; } |
| 990 | + .header-left { gap: 6px; flex: 1; min-width: 0; } |
| 991 | + .header-left h1 { display: none; } |
| 992 | + .header-right { gap: 8px; } |
| 993 | + .audit-toggle span:last-child { display: none; } |
| 994 | + .audit-toggle { padding: 4px 6px; } |
| 995 | + |
| 996 | + /* ── Tabs — scrollable strip ── */ |
| 997 | + .view-tabs { overflow-x: auto; -webkit-overflow-scrolling: touch; flex-shrink: 1; min-width: 0; scrollbar-width: none; } |
| 998 | + .view-tabs::-webkit-scrollbar { display: none; } |
| 999 | + .view-tab { padding: 3px 10px; font-size: 10px; white-space: nowrap; flex-shrink: 0; } |
| 1000 | + |
| 1001 | + /* ── Chat layout — stack vertically ── */ |
988 | 1002 | .chat-view { flex-direction: column; } |
989 | | - .panel-cam { width: 100%; min-width: 0; border-right: none; border-bottom: 1px solid #21262d; } |
| 1003 | + .panel-cam { width: 100%; min-width: 0; border-right: none; border-bottom: 1px solid #21262d; padding: 10px; gap: 10px; } |
990 | 1004 | .camera-container { aspect-ratio: 16/9; } |
| 1005 | + |
| 1006 | + /* ── Controls — larger touch targets ── */ |
| 1007 | + .controls { gap: 6px; } |
| 1008 | + .ctrl-btn { min-height: 44px; padding: 10px 12px; font-size: 12px; } |
| 1009 | + .speaker-toggle { min-height: 44px; font-size: 12px; } |
| 1010 | + |
| 1011 | + /* ── Vitals — compact ── */ |
| 1012 | + .agent-vitals { font-size: 10px; } |
| 1013 | + .vital-value { font-size: 14px; } |
| 1014 | + .vital-label { font-size: 7px; } |
| 1015 | + .vitals-wave { height: 28px; } |
| 1016 | + |
| 1017 | + /* ── Conversation ── */ |
| 1018 | + .conversation { padding: 10px 12px; font-size: 12px; } |
| 1019 | + |
| 1020 | + /* ── Input bar — full width, tappable ── */ |
| 1021 | + .input-bar { padding: 8px 10px; gap: 6px; } |
| 1022 | + .input-bar input { min-height: 44px; font-size: 14px; padding: 10px 12px; } |
| 1023 | + .input-bar button { min-height: 44px; padding: 10px 14px; } |
| 1024 | + |
| 1025 | + /* ── Chat sidebar — overlay when expanded ── */ |
| 1026 | + .chat-sidebar { position: absolute; left: 0; top: 0; bottom: 0; z-index: 60; width: 260px; min-width: 260px; } |
| 1027 | + .chat-sidebar.collapsed { width: 0; min-width: 0; } |
| 1028 | + |
| 1029 | + /* ── File sidebar / Files panel ── */ |
991 | 1030 | .activity-bar { display: none; } |
992 | | - .file-sidebar { width: 100%; min-width: 0; max-height: 40vh; border-right: none; border-bottom: 1px solid #21262d; } |
| 1031 | + .file-sidebar { display: none; } |
993 | 1032 | .files-panel { position: absolute; right: 0; top: 0; bottom: 0; z-index: 50; width: 280px; min-width: 280px; } |
| 1033 | + |
| 1034 | + /* ── SkillFlows — stack panels ── */ |
| 1035 | + .flows-view { flex-direction: column; } |
| 1036 | + .flows-view > div { width: 100% !important; min-width: 0 !important; max-width: none !important; border-right: none !important; border-bottom: 1px solid #21262d; } |
| 1037 | + |
| 1038 | + /* ── Scheduler — stack panels ── */ |
| 1039 | + .scheduler-view { flex-direction: column; } |
| 1040 | + .scheduler-view > div { width: 100% !important; min-width: 0 !important; max-width: none !important; border-right: none !important; } |
| 1041 | + |
| 1042 | + /* ── Comms — stack panels ── */ |
| 1043 | + .comms-view { flex-direction: column; overflow-y: auto; } |
| 1044 | + .comms-view > div { width: 100% !important; min-width: 0 !important; max-width: none !important; border-right: none !important; } |
| 1045 | + |
| 1046 | + /* ── Settings — already responsive via max-width ── */ |
| 1047 | + .settings-view { padding: 12px; } |
994 | 1048 | } |
995 | 1049 | </style> |
996 | 1050 | </head> |
@@ -1041,6 +1095,9 @@ <h1>Gitclaw: {{AGENT_NAME}}</h1> |
1041 | 1095 | </div> |
1042 | 1096 | </div> |
1043 | 1097 | <div class="chat-view" id="chatView"> |
| 1098 | + <div id="voiceWarning" style="display:none;padding:8px 14px;margin:8px 8px 0;background:rgba(210,153,34,0.12);border:1px solid rgba(210,153,34,0.3);border-radius:6px;color:#d29922;font-size:12px;"> |
| 1099 | + Voice mode unavailable — no API key set. Use the <a href="#" onclick="switchView('settings');return false;" style="color:#58a6ff;text-decoration:underline;">Settings</a> tab to add your key. Text chat works normally. |
| 1100 | + </div> |
1044 | 1101 | <div class="panel-cam"> |
1045 | 1102 | <div class="camera-container"> |
1046 | 1103 | <div class="camera-off" id="cameraOff">Camera off</div> |
@@ -1441,6 +1498,8 @@ <h3 style="margin:0 0 16px;color:#e6edf3;font-size:16px;">Settings</h3> |
1441 | 1498 | // Notify the iframe that install succeeded |
1442 | 1499 | var frame=document.getElementById('skillsFrame'); |
1443 | 1500 | if(frame&&frame.contentWindow)frame.contentWindow.postMessage({type:'install_success',source:source},'*'); |
| 1501 | + // Refresh SkillFlows so newly installed skill appears immediately |
| 1502 | + loadFlowSkills(); |
1444 | 1503 | } else { |
1445 | 1504 | alert('Install failed: '+(d.error||'Unknown error')); |
1446 | 1505 | } |
@@ -1939,6 +1998,14 @@ <h3 style="margin:0 0 16px;color:#e6edf3;font-size:16px;">Settings</h3> |
1939 | 1998 | case'audio_delta':playAudioDelta(m.audio);break; |
1940 | 1999 | case'interrupt':flushAudio();break; |
1941 | 2000 | case'transcript': |
| 2001 | + if(m.role==='assistant'&&m.text&&m.text.indexOf('Voice mode unavailable')===0){ |
| 2002 | + document.getElementById('voiceWarning').style.display='block'; |
| 2003 | + var _mic=document.getElementById('micBtn');if(_mic)_mic.style.display='none'; |
| 2004 | + var _cam=document.getElementById('cameraBtn');if(_cam)_cam.style.display='none'; |
| 2005 | + var _scr=document.getElementById('screenBtn');if(_scr)_scr.style.display='none'; |
| 2006 | + var _spk=document.querySelector('.speaker-toggle');if(_spk)_spk.style.display='none'; |
| 2007 | + break; |
| 2008 | + } |
1942 | 2009 | if(m.role==='user'&&!m.partial){ |
1943 | 2010 | var isTg=m.text&&m.text.startsWith('[Telegram]'); |
1944 | 2011 | var isWa=m.text&&m.text.startsWith('[WhatsApp]'); |
|
0 commit comments