Skip to content

Commit c374af8

Browse files
committed
feat(sidebar): add collapsible functionality to AccountSidebar and AppSidebar
1 parent 2e5b82f commit c374af8

3 files changed

Lines changed: 42 additions & 14 deletions

File tree

apps/account/src/components/account-sidebar.tsx

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
*/
1919

2020
import { Link, useLocation } from '@tanstack/react-router';
21-
import { Building2, Monitor, Shield, ShieldCheck, User } from 'lucide-react';
21+
import { Building2, Monitor, PanelLeft, Shield, ShieldCheck, User } from 'lucide-react';
2222
import {
2323
Sidebar,
2424
SidebarContent,
@@ -30,7 +30,7 @@ import {
3030
SidebarMenuButton,
3131
SidebarMenuItem,
3232
SidebarSeparator,
33-
SidebarTrigger,
33+
useSidebar,
3434
} from '@/components/ui/sidebar';
3535

3636
interface NavItem {
@@ -107,10 +107,24 @@ export function AccountSidebar() {
107107
<SidebarFooter>
108108
<SidebarMenu>
109109
<SidebarMenuItem>
110-
<SidebarTrigger />
110+
<CollapseButton />
111111
</SidebarMenuItem>
112112
</SidebarMenu>
113113
</SidebarFooter>
114114
</Sidebar>
115115
);
116116
}
117+
118+
function CollapseButton() {
119+
const { state, toggleSidebar } = useSidebar();
120+
const collapsed = state === 'collapsed';
121+
return (
122+
<SidebarMenuButton
123+
onClick={toggleSidebar}
124+
tooltip={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}
125+
aria-label={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}
126+
>
127+
<PanelLeft className="size-4" />
128+
</SidebarMenuButton>
129+
);
130+
}

apps/account/src/routes/__root.tsx

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { useEffect, useMemo } from 'react';
55
import { ObjectStackProvider } from '@objectstack/client-react';
66
import { ObjectStackClient } from '@objectstack/client';
77
import { Toaster } from '@/components/ui/toaster';
8-
import { SidebarProvider } from '@/components/ui/sidebar';
8+
import { SidebarInset, SidebarProvider } from '@/components/ui/sidebar';
99
import { TopBar } from '@/components/top-bar';
1010
import { AccountSidebar } from '@/components/account-sidebar';
1111
import { SessionProvider, useSession } from '@/hooks/useSession';
@@ -59,18 +59,16 @@ function RequireAuth({ children }: { children: React.ReactNode }) {
5959
return <div className="flex min-h-screen w-full">{children}</div>;
6060
}
6161

62-
// Authenticated layout: TopBar + Sidebar + main content.
62+
// Authenticated layout: full-height Sidebar + SidebarInset (TopBar + main).
6363
return (
6464
<SidebarProvider>
65-
<div className="flex min-h-screen w-full flex-col">
65+
<AccountSidebar />
66+
<SidebarInset className="flex h-svh min-w-0 flex-col overflow-hidden">
6667
<TopBar />
67-
<div className="flex w-full flex-1 overflow-hidden">
68-
<AccountSidebar />
69-
<main className="flex min-w-0 flex-1 flex-col overflow-hidden bg-background">
70-
{children}
71-
</main>
72-
</div>
73-
</div>
68+
<main className="flex min-h-0 flex-1 flex-col overflow-auto bg-background">
69+
{children}
70+
</main>
71+
</SidebarInset>
7472
</SidebarProvider>
7573
);
7674
}

apps/studio/src/components/app-sidebar.tsx

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import {
2828
Anchor,
2929
UserCog,
3030
ChevronRight,
31+
PanelLeft,
3132
Settings,
3233
Wrench,
3334
Sparkles,
@@ -56,6 +57,7 @@ import {
5657
SidebarMenuSubItem,
5758
SidebarMenuSubButton,
5859
SidebarTrigger,
60+
useSidebar,
5961
} from "@/components/ui/sidebar"
6062
import {
6163
Collapsible,
@@ -566,10 +568,24 @@ export function AppSidebar({
566568
<SidebarFooter>
567569
<SidebarMenu>
568570
<SidebarMenuItem>
569-
<SidebarTrigger />
571+
<CollapseButton />
570572
</SidebarMenuItem>
571573
</SidebarMenu>
572574
</SidebarFooter>
573575
</Sidebar>
574576
)
575577
}
578+
579+
function CollapseButton() {
580+
const { state, toggleSidebar } = useSidebar()
581+
const collapsed = state === 'collapsed'
582+
return (
583+
<SidebarMenuButton
584+
onClick={toggleSidebar}
585+
tooltip={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}
586+
aria-label={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}
587+
>
588+
<PanelLeft className="size-4" />
589+
</SidebarMenuButton>
590+
)
591+
}

0 commit comments

Comments
 (0)