diff options
Diffstat (limited to 'modules/core/module-chatstudio.js')
| -rw-r--r-- | modules/core/module-chatstudio.js | 44 |
1 files changed, 34 insertions, 10 deletions
diff --git a/modules/core/module-chatstudio.js b/modules/core/module-chatstudio.js index 5777acf..762eae3 100644 --- a/modules/core/module-chatstudio.js +++ b/modules/core/module-chatstudio.js @@ -114,10 +114,16 @@ class ChatStudioModule { window._csGlobalsInited = true; } - // Fetch HTML template + // Fetch HTML template (cached after first load) + if (this._overlayHtml) { + // Overlay div already exists (just hidden). No-op. + resolve(); + return; + } fetch('chat/chat-ui.html?v=4') .then(r => r.text()) .then(html => { + this._overlayHtml = html; // cache for re-open // Insert overlay into body if not already there if (!document.getElementById('chat-overlay')) { const temp = document.createElement('div'); @@ -190,10 +196,10 @@ class ChatStudioModule { window.showToast('Chat overlay failed: ' + err.message); } - // Clean up any partial overlay DOM + // Clean up any partial overlay DOM — hide instead of remove so cached HTML path still works const partialOverlay = document.getElementById('chat-overlay'); if (partialOverlay) { - partialOverlay.remove(); + partialOverlay.style.display = 'none'; } // Reset state so user can retry @@ -301,17 +307,35 @@ class ChatStudioModule { el.style.height = Math.min(el.scrollHeight, 150) + 'px'; } + // Close sidebar when clicking outside on mobile + var backdrop = document.getElementById('sidebarBackdrop'); + if (!backdrop) { + backdrop = document.createElement('div'); + backdrop.id = 'sidebarBackdrop'; + backdrop.style.cssText = 'position:fixed;top:0;left:0;right:0;bottom:0;z-index:99;display:none;background:transparent'; + backdrop.onclick = function() { closeSidebar(); }; + document.getElementById('chat-overlay')?.appendChild(backdrop); + } + function toggleSidebar() { var s = document.getElementById('sidebar'); - if (s) s.classList.toggle('open'); - var b = document.getElementById('sidebarBackdrop'); - if (b) b.classList.toggle('open'); + if (!s) return; + // On mobile (<700px) use .open, on desktop use .collapsed + var isMobile = window.innerWidth <= 700; + if (isMobile) { + s.classList.toggle('open'); + } else { + s.classList.toggle('collapsed'); + // Toggle backdrop on mobile regardless + } + if (backdrop) { + backdrop.style.display = s.classList.contains('open') || s.classList.contains('collapsed') ? 'block' : 'none'; + } } function closeSidebar() { var s = document.getElementById('sidebar'); - if (s) s.classList.remove('open'); - var b = document.getElementById('sidebarBackdrop'); - if (b) b.classList.remove('open'); + if (s) { s.classList.remove('open'); s.classList.remove('collapsed'); } + if (backdrop) backdrop.style.display = 'none'; } // ── Log System ── @@ -403,7 +427,7 @@ class ChatStudioModule { OLLAMA_API_KEY = document.getElementById('ollamaApiKey').value.trim(); DEFAULT_MODEL = document.getElementById('defaultModel').value.trim() || 'llama3.2'; USE_STREAMING = document.getElementById('streamingToggle').checked; - API_BASE = document.getElementById('apiBase').value.trim() || '/api'; + API_BASE = (document.getElementById('apiBase')?.value || '/api').trim(); try { var settings = { ollamaUrl: OLLAMA_URL, |