From 2774b938303b90ed9804181ff1309c7716d74a13 Mon Sep 17 00:00:00 2001 From: benya Date: Fri, 3 Apr 2026 02:29:01 +0300 Subject: [PATCH] feat: add collapsible sidebar rail mode --- apps/web/src/components/app-shell.tsx | 82 +++++++++++++++++++-------- 1 file changed, 57 insertions(+), 25 deletions(-) diff --git a/apps/web/src/components/app-shell.tsx b/apps/web/src/components/app-shell.tsx index ab8c885..019a901 100644 --- a/apps/web/src/components/app-shell.tsx +++ b/apps/web/src/components/app-shell.tsx @@ -44,6 +44,7 @@ export function AppShell({ children }: { children: React.ReactNode }) { const [settingsOpen, setSettingsOpen] = useState(false) const [userMenuOpen, setUserMenuOpen] = useState(false) const [paletteOpen, setPaletteOpen] = useState(false) + const [sidebarCollapsed, setSidebarCollapsed] = useState(false) const logoutMutation = useMutation({ mutationFn: logout, onSettled: () => { @@ -52,6 +53,17 @@ export function AppShell({ children }: { children: React.ReactNode }) { }, }) + useEffect(() => { + const stored = window.localStorage.getItem('temporserv.sidebar-collapsed') + if (stored === 'true') { + setSidebarCollapsed(true) + } + }, []) + + useEffect(() => { + window.localStorage.setItem('temporserv.sidebar-collapsed', String(sidebarCollapsed)) + }, [sidebarCollapsed]) + useEffect(() => { function onKeyDown(event: KeyboardEvent) { if ((event.ctrlKey || event.metaKey) && event.key === '/') { @@ -80,7 +92,7 @@ export function AppShell({ children }: { children: React.ReactNode }) {
} /> } /> - } /> + } onClick={() => setSidebarCollapsed((value) => !value)} />
@@ -119,22 +131,32 @@ export function AppShell({ children }: { children: React.ReactNode }) {
-
+
@@ -191,13 +218,18 @@ export function AppShell({ children }: { children: React.ReactNode }) { function TopIconButton({ icon, onClick, + active = false, }: { icon: React.ReactNode onClick?: () => void + active?: boolean }) { return (