aboutsummaryrefslogtreecommitdiff
path: root/modules/core/module-chatstudio.js
diff options
context:
space:
mode:
authorAgando <roduccomm@gmail.com>2026-05-30 18:01:51 +0200
committerAgando <roduccomm@gmail.com>2026-05-30 18:01:51 +0200
commitd8bf7fa398d6d928325be9b5c64ca24875bfeef8 (patch)
tree49ee4b3586ad68c648d546e6831abc30d8576be5 /modules/core/module-chatstudio.js
parente3fb2d434c4f7317944b7c77781599528d766a39 (diff)
auto: 2026-05-30_18:00 changes
Diffstat (limited to 'modules/core/module-chatstudio.js')
-rw-r--r--modules/core/module-chatstudio.js44
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,