Skip to Content
ComponentsSidebarMenu

SidebarMenu

Vertical application navigation with sections, nested items, badges, four colour themes and a collapsed icon-only mode.

Import

import { SidebarMenu, SidebarMenuSection, SidebarMenuItem, SidebarMenuSub, SidebarMenuSubItem, } from "@raydenui/ui";

Usage

Basic

Selection is by value, not href: each item carries a unique value and the menu reports the active one through onValueChange. Wire that to your own router.

Preview
<SidebarMenu defaultValue="dashboard" className="w-[260px]"> <SidebarMenuSection> <SidebarMenuItem value="dashboard" icon="grid"> Dashboard </SidebarMenuItem> <SidebarMenuItem value="transactions" icon="wallet"> Transactions </SidebarMenuItem> <SidebarMenuItem value="settings" icon="settings"> Settings </SidebarMenuItem> </SidebarMenuSection> </SidebarMenu>

Routing

SidebarMenuItem renders a <button>, so pass navigation through onValueChange:

const navigate = useNavigate(); const routes = { dashboard: "/", transactions: "/transactions" }; <SidebarMenu value={active} onValueChange={(value) => navigate(routes[value])}> {/* … */} </SidebarMenu>

Sections

SidebarMenuSection groups items under an optional title.

Preview
<SidebarMenu defaultValue="dashboard" className="w-[260px]"> <SidebarMenuSection title="MAIN MENU" showDivider> <SidebarMenuItem value="dashboard" icon="grid"> Dashboard </SidebarMenuItem> <SidebarMenuItem value="reports" icon="chart" badge={5}> Reports </SidebarMenuItem> </SidebarMenuSection> <SidebarMenuSection title="ACCOUNT"> <SidebarMenuItem value="settings" icon="settings"> Settings </SidebarMenuItem> </SidebarMenuSection> </SidebarMenu>

Nested items

Nest a SidebarMenuSub inside a SidebarMenuItem. The parent supplies the icon and label; SidebarMenuSub itself takes only children.

Preview
<SidebarMenu defaultValue="invoices" className="w-[260px]"> <SidebarMenuSection> <SidebarMenuItem value="finance" icon="bank"> Finance <SidebarMenuSub> <SidebarMenuSubItem value="invoices">Invoices</SidebarMenuSubItem> <SidebarMenuSubItem value="payouts">Payouts</SidebarMenuSubItem> </SidebarMenuSub> </SidebarMenuItem> </SidebarMenuSection> </SidebarMenu>

Themes

theme accepts "light", "blue", "dark-blue" and "dark-grey".

Preview
<SidebarMenu defaultValue="dashboard" theme="dark-blue" className="w-[260px]"> {/* … */} </SidebarMenu>

Collapsed

collapsed switches to an 82px icon-only rail. Items whose children are not a plain string need an explicit label so the icon button still has an accessible name; expandable items open their children in a flyout.

Preview
<SidebarMenu defaultValue="dashboard" collapsed> <SidebarMenuSection showDivider={false}> <SidebarMenuItem value="dashboard" icon="grid" label="Dashboard"> Dashboard </SidebarMenuItem> <SidebarMenuItem value="reports" icon="chart" label="Reports"> Reports </SidebarMenuItem> </SidebarMenuSection> </SidebarMenu>

Props

SidebarMenu

PropTypeDefaultDescription
valuestring—Controlled active item value
defaultValuestring—Uncontrolled default active item
onValueChange(value: string) => void—Called when the active item changes
collapsedbooleanfalseIcon-only mode, 82px wide
theme"light" | "blue" | "dark-blue" | "dark-grey""light"Colour theme

SidebarMenuSection

PropTypeDefaultDescription
titlestring—Section title
showDividerboolean—Show a divider below the section

SidebarMenuItem

PropTypeDefaultDescription
valuestring—Unique identifier (required)
iconReactNode | IconName—Leading icon
badgestring | number—Count badge on the right
labelstring—Accessible name when collapsed. Required when children are not a string
disabledbooleanfalseDisabled state

SidebarMenuSub

Takes only children. Nest it inside a SidebarMenuItem, which supplies the icon and label.

SidebarMenuSubItem

PropTypeDefaultDescription
valuestring—Unique identifier (required)

Accessibility

Last updated on
SelectSlider