AppSidebar
Navigation sidebar displaying menu items, allowing users to navigate between different sections of the application. They can collapse it to an icon-only sidebar by clicking on the sidebar icon in the breadcrumb. On mobile, it renders as a collapsible drawer. <AppSidebar>
leverages shadcn/ui’s Sidebar component.
<AppSidebar>
is included in the default <Layout>
component. It includes:
- the application name and logo, whicj is a link to the home page (
/
), - a link to the dashboard (if defined in
<Admin dashboard>
), and - links to all the list views defined in
<Resource list>
components.
To customize all these elements, edit the @/components/admin/app-sidebar.tsx
file.
For example, to customize the app name and logo, edit the SidebarHeader
section:
// in @/components/admin/app-sidebar.tsximport { Armchair } from "lucide-react";
export function AppSidebar() { const hasDashboard = useHasDashboard(); const resources = useResourceDefinitions(); const { openMobile, setOpenMobile } = useSidebar(); const handleClick = () => { if (openMobile) { setOpenMobile(false); } }; return ( <Sidebar variant="floating" collapsible="icon"> <SidebarHeader> <SidebarMenu> <SidebarMenuItem> <SidebarMenuButton asChild className="data-[slot=sidebar-menu-button]:!p-1.5" > <Link to="/"> <Armchair className="!size-5"/> <span className="text-base font-semibold">My Company</span> </Link> </SidebarMenuButton> </SidebarMenuItem> </SidebarMenu> </SidebarHeader> <SidebarContent> {/* Menu items */} </SidebarContent> <SidebarFooter /> </Sidebar> );}
To reorder the Resource menu items, reorder the <Resource>
components in the <Admin>
component.
If you want to hide some resources from the sidebar, edit the SidebarMenu
section and filter out the resources you don’t want to display. For example, to hide the categories
resource:
// in @/components/admin/app-sidebar.tsxexport function AppSidebar() { const hasDashboard = useHasDashboard(); const resources = useResourceDefinitions(); const { openMobile, setOpenMobile } = useSidebar(); const handleClick = () => { if (openMobile) { setOpenMobile(false); } }; return ( <Sidebar variant="floating" collapsible="icon"> <SidebarHeader> {/* App name and logo */} </SidebarHeader> <SidebarContent> <SidebarGroup> <SidebarGroupContent> <SidebarMenu> {hasDashboard ? ( <DashboardMenuItem onClick={handleClick} /> ) : null} {Object.keys(resources) .filter((name) => resources[name].hasList) .filter((name) => name !== "categories") // Hide categories resource .map((name) => ( <ResourceMenuItem key={name} name={name} onClick={handleClick} /> ))} </SidebarMenu> </SidebarGroupContent> </SidebarGroup> </SidebarContent> <SidebarFooter /> </Sidebar> );}
To customize the menu items, edit the SidebarContent
section. For example, if you added a settings
CustomRoute
, here is how to add a link to it in the sidebar:
// in @/components/admin/app-sidebar.tsximport { Settings } from "lucide-react";import { Link } from "react-route";
export function AppSidebar() { const hasDashboard = useHasDashboard(); const resources = useResourceDefinitions(); const { openMobile, setOpenMobile } = useSidebar(); const handleClick = () => { if (openMobile) { setOpenMobile(false); } }; return ( <Sidebar variant="floating" collapsible="icon"> <SidebarHeader> {/* App name and logo */} </SidebarHeader> <SidebarContent> <SidebarGroup> <SidebarGroupContent> <SidebarMenu> {hasDashboard ? ( <DashboardMenuItem onClick={handleClick} /> ) : null} {Object.keys(resources) .filter((name) => resources[name].hasList) .map((name) => ( <ResourceMenuItem key={name} name={name} onClick={handleClick} /> ))} <SidebarMenuItem> <SidebarMenuButton asChild> <Link to="/settings"> <Settings /> <span>Settings</span> </Link> </SidebarMenuButton> </SidebarMenuItem> </SidebarMenu> </SidebarGroupContent> </SidebarGroup> </SidebarContent> <SidebarFooter /> </Sidebar> );}
For more customization options, refer to the shadcn/ui Sidebar documentation.