Command Palette

Search for a command to run...

Sidebar

shadcn/ui

Responsive sidebar layout with collapsible variants and keyboard toggle.

Sidebar

Dashboard

Main content goes here. Toggle the sidebar to see the layout adjust.

import {  SidebarProvider,  Sidebar,  SidebarTrigger,  SidebarHeader,  SidebarContent,  SidebarGroup,  SidebarGroupLabel,  SidebarGroupContent,  SidebarMenu,  SidebarMenuItem,  SidebarMenuButton,  SidebarFooter,  SidebarSeparator,  SidebarInset,} from "@/components/optics/sidebar";import { Input } from "@/components/optics/input";import { Button } from "@/components/optics/button";import { Home, Inbox, Settings2, Users } from "lucide-react";<div className="w-full rounded-xl border bg-background">  <SidebarProvider    className="rounded-xl"    defaultOpen  >    <div className="w-full flex min-h-[320px] rounded-xl!">      <Sidebar        className="static inset-auto w-full h-full rounded-xl!"        collapsible="icon"        variant="sidebar"      >        <SidebarHeader className="gap-3 rounded-t-xl!">          <div className="flex items-center justify-between">            <span className="text-sm font-semibold truncate">              Project            </span>            <SidebarTrigger className="h-7 w-7" />          </div>          <Input            className="h-8 text-xs"            placeholder="Search"          />        </SidebarHeader>        <SidebarContent>          <SidebarGroup>            <SidebarGroupLabel>              General            </SidebarGroupLabel>            <SidebarGroupContent>              <SidebarMenu>                <SidebarMenuItem>                  <SidebarMenuButton>                    <House className="size-4" />                    Home                  </SidebarMenuButton>                </SidebarMenuItem>                <SidebarMenuItem>                  <SidebarMenuButton>                    <Inbox className="size-4" />                    Inbox                  </SidebarMenuButton>                </SidebarMenuItem>                <SidebarMenuItem>                  <SidebarMenuButton>                    <Users className="size-4" />                    Teams                  </SidebarMenuButton>                </SidebarMenuItem>              </SidebarMenu>            </SidebarGroupContent>          </SidebarGroup>          <SidebarSeparator />          <SidebarGroup>            <SidebarGroupLabel>              Settings            </SidebarGroupLabel>            <SidebarGroupContent>              <SidebarMenu>                <SidebarMenuItem>                  <SidebarMenuButton>                    <Settings2 className="size-4" />                    Preferences                  </SidebarMenuButton>                </SidebarMenuItem>              </SidebarMenu>            </SidebarGroupContent>          </SidebarGroup>        </SidebarContent>        <SidebarFooter>          <Button            className="w-full truncate"            size="sm"            variant="outline"          >            Upgrade          </Button>        </SidebarFooter>      </Sidebar>      <SidebarInset className="bg-muted/40 p-4">        <div className="w-full flex h-full flex-col gap-4 rounded-lg border bg-background p-4">          <div className="flex items-center justify-between">            <h3 className="text-sm font-semibold">              Dashboard            </h3>            <SidebarTrigger className="h-7 w-7" />          </div>          <p className="text-sm text-muted-foreground">            Main content goes here. Toggle the sidebar to see the layout adjust.          </p>        </div>      </SidebarInset>    </div>  </SidebarProvider></div>

Installation

pnpm dlx shadcn@latest add @optics/sidebar

Props

<Sidebar />
Name
Type
side
string(default: left)
variant
string(default: sidebar)
collapsible
string(default: offExamples)

<SidebarGroupAction />
Name
Type
render
string(default: undefined)
<SidebarGroupLabel />
Name
Type
render
string(default: undefined)
<SidebarMenuAction />
Name
Type
render
any
showOnHover
boolean(default: false)
<SidebarMenuButton />
Name
Type
render
string(default: undefined)
isActive
boolean(default: false)
variant
string(default: default)
tooltip
string(default: undefined)
<SidebarMenuSkeleton />
Name
Type
showIcon
boolean(default: false)
<SidebarMenuSubButton />
Name
Type
render
any
isActive
boolean(default: false)
<SidebarProvider />
Name
Type
defaultOpen
boolean(default: true)
open
string(default: undefined)
onOpenChange
string(default: undefined)