diff --git a/static/boot.js b/static/boot.js index da34596b..ae17eb2e 100644 --- a/static/boot.js +++ b/static/boot.js @@ -284,9 +284,11 @@ function expandSidebar(){ _syncSidebarAria(); })(); // ── Boot-time tab visibility ──────────────────────────────────────────────── -// Apply hidden tabs from localStorage before first paint. If the active tab -// is hidden, switch focus to chat. Runs after DOM is ready (unlike theme/skin -// flash-prevention, tab elements aren't available in ). +// Apply hidden tabs from localStorage. The primary flash-prevention is an +// inline
diff --git a/static/panels.js b/static/panels.js index e30da475..9372cbd6 100644 --- a/static/panels.js +++ b/static/panels.js @@ -152,7 +152,6 @@ function _beginSettingsPanelSession() { _settingsThemeOnOpen = localStorage.getItem('hermes-theme') || 'dark'; _settingsSkinOnOpen = localStorage.getItem('hermes-skin') || 'default'; _settingsFontSizeOnOpen = localStorage.getItem('hermes-font-size') || 'default'; - _settingsHiddenTabsOnOpen = _getHiddenTabs().slice(); _pendingSettingsTargetPanel = null; if (_settingsAppearanceAutosaveTimer) { clearTimeout(_settingsAppearanceAutosaveTimer); @@ -5110,7 +5109,6 @@ let _settingsHermesDefaultModelOnOpen = ''; let _settingsSection = 'conversation'; let _currentSettingsSection = 'conversation'; let _settingsAppearanceAutosaveTimer = null; -let _settingsHiddenTabsOnOpen = null; // track hidden_tabs at open time for discard revert let _settingsAppearanceAutosaveRetryPayload = null; let _settingsPreferencesAutosaveTimer = null; let _settingsPreferencesAutosaveRetryPayload = null; @@ -5135,6 +5133,8 @@ function _applyTabVisibility(hidden){ var panel=el.dataset.panel; if(!panel)return; var shouldHide=hidden.indexOf(panel)!==-1; + // Never hide always-visible panels (chat, settings) even if present in hidden_tabs + if(_ALWAYS_VISIBLE_TABS.has(panel)) shouldHide=false; el.classList.toggle('nav-tab-hidden',shouldHide); }); // If the currently active tab is hidden, switch to chat @@ -5342,7 +5342,6 @@ function _rememberAppearanceSaved(payload){ _settingsThemeOnOpen=payload.theme||localStorage.getItem('hermes-theme')||'dark'; _settingsSkinOnOpen=payload.skin||localStorage.getItem('hermes-skin')||'default'; _settingsFontSizeOnOpen=payload.font_size||localStorage.getItem('hermes-font-size')||'default'; - _settingsHiddenTabsOnOpen=Array.isArray(payload.hidden_tabs)?payload.hidden_tabs:[]; } function _scheduleAppearanceAutosave(){ @@ -6477,7 +6476,6 @@ function _applySavedSettingsUi(saved, body, opts){ _settingsHermesDefaultModelOnOpen=body.default_model||_settingsHermesDefaultModelOnOpen||''; // Sync window._defaultModel so newSession() uses the just-saved default without a reload (#908). if(body.default_model) window._defaultModel=body.default_model; - _settingsHiddenTabsOnOpen=_getHiddenTabs().slice(); if(typeof clearMessageRenderCache==='function') clearMessageRenderCache(); renderMessages(); if(typeof syncTopbar==='function') syncTopbar(); diff --git a/tests/test_sidebar_tab_visibility.py b/tests/test_sidebar_tab_visibility.py index bd385fe7..3a936e18 100644 --- a/tests/test_sidebar_tab_visibility.py +++ b/tests/test_sidebar_tab_visibility.py @@ -102,18 +102,4 @@ def test_i18n_coverage(): assert label_count >= 11, f"Expected ≥11 locales, found {label_count}" assert desc_count >= 11, f"Expected ≥11 locales, found {desc_count}" assert label_count == desc_count, \ - f"Label ({label_count}) and desc ({desc_count}) counts must match" - - -def test_settings_session_tracking(): - """Settings open/close lifecycle must track hidden_tabs for discard revert.""" - # _beginSettingsPanelSession snapshots hidden_tabs - begin_block = PANELS_JS[PANELS_JS.find("function _beginSettingsPanelSession"):] - begin_body = begin_block[:begin_block.find("\nfunction ", 1) or 2000] - assert "_settingsHiddenTabsOnOpen" in begin_body - - # _applySavedSettingsUi updates the baseline on full save - apply_block = PANELS_JS[PANELS_JS.find("function _applySavedSettingsUi"):] - apply_body = apply_block[:apply_block.find("\nfunction ", 1) or 5000] - assert "_settingsHiddenTabsOnOpen" in apply_body, \ - "_applySavedSettingsUi must update _settingsHiddenTabsOnOpen after full save" \ No newline at end of file + f"Label ({label_count}) and desc ({desc_count}) counts must match" \ No newline at end of file