diff --git a/apps/web/src/layout/AppLayout.tsx b/apps/web/src/layout/AppLayout.tsx index c274dd9..0a296ea 100644 --- a/apps/web/src/layout/AppLayout.tsx +++ b/apps/web/src/layout/AppLayout.tsx @@ -5,12 +5,19 @@ import { usePersistentState } from '../lib/use-persistent-state'; import { Footer } from './Footer'; import { SidebarChromeContext } from './sidebar-chrome'; import { Sidebar } from './Sidebar'; +import { clampSidebarWidth, SIDEBAR_DEFAULT_WIDTH_REM, SidebarResizer } from './SidebarResizer'; import { TopBar } from './TopBar'; export function AppLayout(): React.JSX.Element { const [sidebarCollapsed, setSidebarCollapsed] = usePersistentState('ui.sidebar.collapsed', false); + const [sidebarWidth, setSidebarWidth] = usePersistentState( + 'ui.sidebar.width', + SIDEBAR_DEFAULT_WIDTH_REM, + ); const [forcedHidden, setForcedHidden] = useState(false); const collapsed = sidebarCollapsed || forcedHidden; + // Clamp on read too — the persisted value may predate a bounds change. + const widthRem = clampSidebarWidth(sidebarWidth); // Ctrl/Cmd+\ toggles the sidebar (same shortcut as Notion), regardless of // which element has focus. @@ -32,8 +39,12 @@ export function AppLayout(): React.JSX.Element { sidebarCollapsed={collapsed} onToggleSidebar={() => setSidebarCollapsed(!sidebarCollapsed)} /> -