Sidebar
A composable, themeable and customizable sidebar.
Installation
Add the sidebar component with the shadcn CLI.
npx shadcn@latest add https://yami.ui.unsanity.ai/r/sidebar.jsonUsage
import {
Sidebar, SidebarContent, SidebarFooter, SidebarGroup,
SidebarGroupContent, SidebarGroupLabel, SidebarHeader,
SidebarMenu, SidebarMenuBadge, SidebarMenuButton,
SidebarMenuItem, SidebarProvider, SidebarTrigger,
} from "@/components/ui/sidebar"
<SidebarProvider>
<Sidebar>
<SidebarHeader>Acme Corp</SidebarHeader>
<SidebarContent>
<SidebarGroup>
<SidebarGroupLabel>Platform</SidebarGroupLabel>
<SidebarMenu>
<SidebarMenuItem>
<SidebarMenuButton isActive>
<LayoutDashboardIcon />Dashboard
</SidebarMenuButton>
</SidebarMenuItem>
<SidebarMenuItem>
<SidebarMenuButton>
<InboxIcon />Inbox
<SidebarMenuBadge>3</SidebarMenuBadge>
</SidebarMenuButton>
</SidebarMenuItem>
</SidebarMenu>
</SidebarGroup>
</SidebarContent>
<SidebarFooter>
<SidebarMenu>
<SidebarMenuItem>
<SidebarMenuButton><UserIcon />Alice Kim</SidebarMenuButton>
</SidebarMenuItem>
</SidebarMenu>
</SidebarFooter>
</Sidebar>
<main><SidebarTrigger />Content</main>
</SidebarProvider>Examples
Basic
Simple nav with active state and SidebarTriggerCode
import {
Sidebar, SidebarContent, SidebarGroup, SidebarGroupContent,
SidebarGroupLabel, SidebarMenu, SidebarMenuButton,
SidebarMenuItem, SidebarProvider, SidebarTrigger,
} from "@/components/ui/sidebar"
<SidebarProvider>
<Sidebar>
<SidebarContent>
<SidebarGroup>
<SidebarGroupLabel>Platform</SidebarGroupLabel>
<SidebarGroupContent>
<SidebarMenu>
<SidebarMenuItem>
<SidebarMenuButton isActive>
<LayoutDashboardIcon />Dashboard
</SidebarMenuButton>
</SidebarMenuItem>
</SidebarMenu>
</SidebarGroupContent>
</SidebarGroup>
</SidebarContent>
</Sidebar>
<main>
<SidebarTrigger />
Content
</main>
</SidebarProvider>With header, footer, and badge
SidebarHeader, SidebarFooter, SidebarMenuBadgeCode
import {
Sidebar, SidebarContent, SidebarFooter, SidebarGroup,
SidebarGroupContent, SidebarGroupLabel, SidebarHeader,
SidebarMenu, SidebarMenuBadge, SidebarMenuButton,
SidebarMenuItem, SidebarProvider, SidebarTrigger,
} from "@/components/ui/sidebar"
<SidebarProvider>
<Sidebar>
<SidebarHeader>Acme Corp</SidebarHeader>
<SidebarContent>
<SidebarGroup>
<SidebarGroupContent>
<SidebarMenu>
<SidebarMenuItem>
<SidebarMenuButton isActive><LayoutDashboardIcon />Dashboard</SidebarMenuButton>
</SidebarMenuItem>
<SidebarMenuItem>
<SidebarMenuButton>
<InboxIcon />Inbox
<SidebarMenuBadge>12</SidebarMenuBadge>
</SidebarMenuButton>
</SidebarMenuItem>
</SidebarMenu>
</SidebarGroupContent>
</SidebarGroup>
</SidebarContent>
<SidebarFooter>
<SidebarMenu>
<SidebarMenuItem>
<SidebarMenuButton><UserIcon />Alice Kim</SidebarMenuButton>
</SidebarMenuItem>
</SidebarMenu>
</SidebarFooter>
</Sidebar>
<main><SidebarTrigger />Content</main>
</SidebarProvider>With search and submenu
SidebarInput, SidebarMenuSub, SidebarMenuSubButtonCode
import {
Sidebar, SidebarContent, SidebarGroup, SidebarGroupContent,
SidebarGroupLabel, SidebarHeader, SidebarInput,
SidebarMenu, SidebarMenuButton, SidebarMenuItem,
SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem,
SidebarProvider, SidebarTrigger,
} from "@/components/ui/sidebar"
<SidebarProvider>
<Sidebar>
<SidebarHeader>
<SidebarInput placeholder="Search..." />
</SidebarHeader>
<SidebarContent>
<SidebarGroup>
<SidebarMenu>
<SidebarMenuItem>
<SidebarMenuButton><UsersIcon />Team</SidebarMenuButton>
<SidebarMenuSub>
<SidebarMenuSubItem>
<SidebarMenuSubButton>Members</SidebarMenuSubButton>
</SidebarMenuSubItem>
<SidebarMenuSubItem>
<SidebarMenuSubButton isActive>Roles</SidebarMenuSubButton>
</SidebarMenuSubItem>
</SidebarMenuSub>
</SidebarMenuItem>
</SidebarMenu>
</SidebarGroup>
</SidebarContent>
</Sidebar>
<main><SidebarTrigger />Content</main>
</SidebarProvider>With group action and menu action
SidebarGroupAction, SidebarMenuAction for contextual controlsCode
import {
Sidebar, SidebarContent, SidebarGroup, SidebarGroupAction,
SidebarGroupContent, SidebarGroupLabel,
SidebarMenu, SidebarMenuAction, SidebarMenuButton,
SidebarMenuItem, SidebarProvider, SidebarTrigger,
} from "@/components/ui/sidebar"
import { MoreHorizontalIcon, PlusIcon } from "lucide-react"
<SidebarGroup>
<SidebarGroupLabel>Projects</SidebarGroupLabel>
<SidebarGroupAction title="Add project">
<PlusIcon />
</SidebarGroupAction>
<SidebarGroupContent>
<SidebarMenu>
{projects.map((name) => (
<SidebarMenuItem key={name}>
<SidebarMenuButton><FolderIcon />{name}</SidebarMenuButton>
<SidebarMenuAction showOnHover title="More options">
<MoreHorizontalIcon />
</SidebarMenuAction>
</SidebarMenuItem>
))}
</SidebarMenu>
</SidebarGroupContent>
</SidebarGroup>Skeleton loading
SidebarMenuSkeleton for loading statesCode
import {
Sidebar, SidebarContent, SidebarGroup, SidebarGroupContent,
SidebarGroupLabel, SidebarMenu, SidebarMenuItem,
SidebarMenuSkeleton, SidebarProvider, SidebarTrigger,
} from "@/components/ui/sidebar"
// Show skeletons while data is loading
<SidebarMenu>
{Array.from({ length: 4 }).map((_, i) => (
<SidebarMenuItem key={i}>
<SidebarMenuSkeleton showIcon />
</SidebarMenuItem>
))}
</SidebarMenu>Multiple groups with separator
SidebarSeparator divides logical sectionsCode
import {
Sidebar, SidebarContent, SidebarGroup, SidebarGroupContent,
SidebarGroupLabel, SidebarMenu, SidebarMenuButton,
SidebarMenuItem, SidebarProvider, SidebarSeparator, SidebarTrigger,
} from "@/components/ui/sidebar"
<Sidebar>
<SidebarContent>
<SidebarGroup>
<SidebarGroupLabel>Main</SidebarGroupLabel>
<SidebarMenu>...</SidebarMenu>
</SidebarGroup>
<SidebarSeparator />
<SidebarGroup>
<SidebarGroupLabel>Account</SidebarGroupLabel>
<SidebarMenu>...</SidebarMenu>
</SidebarGroup>
</SidebarContent>
</Sidebar>