{"record":{"id":"21cbea79e16c728f","repo":"googleapis/mcp-toolbox","slug":"failed-to-save-panel-width","errorCode":null,"errorMessage":"Failed to save panel width:","messagePattern":"Failed to save panel width:","errorType":"console","errorClass":null,"httpStatus":null,"severity":"info","filePath":"internal/server/static/js/resize.js","lineNumber":77,"sourceCode":"\n        const clampedWidth = Math.max(MIN_WIDTH, Math.min(newWidth, maxWidth));\n        setPanelWidth(secondNav, clampedWidth);\n    };\n\n    const onMouseUp = () => {\n        document.removeEventListener('mousemove', onMouseMove);\n        document.removeEventListener('mouseup', onMouseUp);\n\n        resizeHandle.classList.remove('active');\n        document.body.style.cursor = '';\n        document.body.style.userSelect = '';\n\n        // Save width to localStorage\n        try {\n            localStorage.setItem(STORAGE_KEY, secondNav.offsetWidth.toString());\n        } catch (e) {\n            // localStorage may be unavailable in private browsing mode\n            console.warn('Failed to save panel width:', e);\n        }\n    };\n\n    resizeHandle.addEventListener('mousedown', (e) => {\n        startX = e.clientX;\n        startWidth = secondNav.offsetWidth;\n        resizeHandle.classList.add('active');\n        document.body.style.cursor = 'ew-resize';\n        document.body.style.userSelect = 'none';\n        e.preventDefault();\n\n        document.addEventListener('mousemove', onMouseMove);\n        document.addEventListener('mouseup', onMouseUp);\n    });\n\n    // Handle window resize to enforce max width\n    window.addEventListener('resize', () => {\n        const currentWidth = secondNav.offsetWidth;","sourceCodeStart":59,"sourceCodeEnd":95,"githubUrl":"https://github.com/googleapis/mcp-toolbox/blob/8cc6e09de2ad7b8bffc77751799585a1401a48eb/internal/server/static/js/resize.js#L59-L95","documentation":"After the user finishes dragging the panel resize handle (onMouseUp), resize.js saves the new width to localStorage via setItem. If storage is unavailable or quota is exceeded, the write throws and the code logs this warning. The layout still works for the session; persistence is simply skipped.","triggerScenarios":"Completing a panel resize while localStorage.setItem throws: storage blocked by browser settings/extensions, private browsing, quota exceeded (storage full), or document sandboxed.","commonSituations":"Quota-full browsers with many stored sites; privacy extensions; embedded UI in sandboxed iframe; enterprise policies disabling web storage.","solutions":["No action required — resizing still works, only persistence is skipped","Free browser storage / clear old site data to resolve quota errors","Allow site data for the toolbox origin in browser settings","Reopen the UI outside private browsing to persist the width"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"function canPersist() {\n  try { localStorage.setItem('__t', '1'); localStorage.removeItem('__t'); return true; } catch (e) { return false; }\n}","typeGuard":null,"tryCatchPattern":"try { localStorage.setItem(key, width); } catch (e) { console.debug('width not persisted:', e); }","preventionTips":["Keep browser storage quota healthy by clearing stale site data","Allow site data for the toolbox origin in browser/extension settings","Persist UI preferences outside private browsing windows","Accept the warning as harmless — only persistence is affected"],"tags":["javascript","browser","localstorage","ui","quota"],"backgroundTag":"localstorage-unavailable","analyzedSha":"8cc6e09de2ad7b8bffc77751799585a1401a48eb","analyzedAt":"2026-09-05T01:10:36.887Z","contentChangedAt":"2026-09-05T01:10:36.887Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}