Acronis UIKit
Legacy (shadcn-uikit)Components

Sidebar

An application sidebar layout with collapsible navigation, grouping, and mobile support.

Usage

import {
  SidebarProvider,
  Sidebar,
  SidebarContent,
  SidebarGroup,
  SidebarGroupLabel,
  SidebarMenu,
  SidebarMenuItem,
  SidebarMenuButton,
} from '@acronis-platform/shadcn-uikit';

Full

A complete sidebar with header, grouped menu items, and footer.

View source
import { useState } from 'react';
import {
  Sidebar,
  SidebarContent,
  SidebarFooter,
  SidebarGroup,
  SidebarGroupContent,
  SidebarGroupLabel,
  SidebarHeader,
  SidebarMenu,
  SidebarMenuButton,
  SidebarMenuItem,
  SidebarMenuSub,
  SidebarMenuSubButton,
  SidebarMenuSubItem,
  SidebarProvider,
} from '@acronis-platform/shadcn-uikit/react';
import {
  CalendarIcon,
  ChevronRightIcon,
  FileTextIcon,
  HelpCircleIcon,
  HomeFolderIcon,
  MailboxIcon,
  SearchIcon,
  SettingsIcon,
  ShieldIcon,
  UserIcon,
  UsersIcon,
} from '@acronis-platform/shadcn-uikit';
import { BarChartIcon } from '../icons/missing-icons';
export function SidebarFull() {
  const [activeItem, setActiveItem] = useState('home');

  const mainNavItems = [
    { id: 'home', title: 'Home', icon: HomeFolderIcon },
    { id: 'inbox', title: 'Inbox', icon: MailboxIcon, badge: '7' },
    { id: 'calendar', title: 'Calendar', icon: CalendarIcon },
    { id: 'search', title: 'Search', icon: SearchIcon },
    { id: 'settings', title: 'Settings', icon: SettingsIcon },
  ];

  const projectNavItems = [
    {
      id: 'projects',
      title: 'Projects',
      icon: FileTextIcon,
      subItems: [
        { id: 'project-1', title: 'Project Alpha' },
        { id: 'project-2', title: 'Project Beta' },
        { id: 'project-3', title: 'Project Gamma' },
      ],
    },
    {
      id: 'team',
      title: 'Team',
      icon: UsersIcon,
      subItems: [
        { id: 'team-members', title: 'Members' },
        { id: 'team-roles', title: 'Roles' },
        { id: 'team-permissions', title: 'Permissions' },
      ],
    },
  ];

  const analyticsNavItems = [
    { id: 'analytics', title: 'Analytics', icon: BarChartIcon },
    { id: 'reports', title: 'Reports', icon: FileTextIcon },
    { id: 'security', title: 'Security', icon: ShieldIcon, tag: 'NEW' },
  ];

  return (
    <div className="h-[600px] border rounded-lg overflow-hidden">
      <SidebarProvider defaultOpen={true}>
        <Sidebar collapsible="none">
          <SidebarHeader className="border-b border-sidebar-border">
            <div className="flex items-center gap-2 px-4 py-3">
              <div className="flex h-8 w-8 items-center justify-center rounded-lg bg-sidebar-accent text-sidebar-accent-foreground">
                <HomeFolderIcon className="h-4 w-4" />
              </div>
              <div className="flex flex-col">
                <span className="text-sm font-semibold">Acronis UIKit</span>
                <span className="text-xs text-sidebar-foreground/70">
                  Demo Application
                </span>
              </div>
            </div>
          </SidebarHeader>

          <SidebarContent>
            <SidebarGroup>
              <SidebarGroupContent>
                <SidebarMenu>
                  {mainNavItems.map((item) => (
                    <SidebarMenuItem key={item.id}>
                      <SidebarMenuButton
                        isActive={activeItem === item.id}
                        onClick={() => setActiveItem(item.id)}
                      >
                        <item.icon />
                        <span>{item.title}</span>
                        {item.badge && (
                          <span className="ml-auto flex h-5 w-5 items-center justify-center rounded-full bg-white text-xs font-bold text-[#243143]">
                            {item.badge}
                          </span>
                        )}
                      </SidebarMenuButton>
                    </SidebarMenuItem>
                  ))}
                </SidebarMenu>
              </SidebarGroupContent>
            </SidebarGroup>

            <SidebarGroup>
              <SidebarGroupLabel className="text-xs font-bold uppercase tracking-wider text-sidebar-foreground/70">
                Workspace
              </SidebarGroupLabel>
              <SidebarGroupContent>
                <SidebarMenu>
                  {projectNavItems.map((item) => (
                    <SidebarMenuItem key={item.id}>
                      <SidebarMenuButton
                        isActive={activeItem === item.id}
                        onClick={() => setActiveItem(item.id)}
                      >
                        <item.icon />
                        <span>{item.title}</span>
                        <ChevronRightIcon className="ml-auto h-4 w-4" />
                      </SidebarMenuButton>
                      {item.subItems && (
                        <SidebarMenuSub>
                          {item.subItems.map((subItem) => (
                            <SidebarMenuSubItem key={subItem.id}>
                              <SidebarMenuSubButton
                                isActive={activeItem === subItem.id}
                                onClick={() => setActiveItem(subItem.id)}
                              >
                                <span>{subItem.title}</span>
                              </SidebarMenuSubButton>
                            </SidebarMenuSubItem>
                          ))}
                        </SidebarMenuSub>
                      )}
                    </SidebarMenuItem>
                  ))}
                </SidebarMenu>
              </SidebarGroupContent>
            </SidebarGroup>

            <SidebarGroup>
              <SidebarGroupLabel className="text-xs font-bold uppercase tracking-wider text-sidebar-foreground/70">
                Insights
              </SidebarGroupLabel>
              <SidebarGroupContent>
                <SidebarMenu>
                  {analyticsNavItems.map((item) => (
                    <SidebarMenuItem key={item.id}>
                      <SidebarMenuButton
                        isActive={activeItem === item.id}
                        onClick={() => setActiveItem(item.id)}
                      >
                        <item.icon />
                        <span>{item.title}</span>
                        {item.tag && (
                          <span className="ml-auto rounded-full bg-[#DAE9AE] px-2 py-0 text-[10px] font-bold tracking-wider text-[#407009]">
                            {item.tag}
                          </span>
                        )}
                      </SidebarMenuButton>
                    </SidebarMenuItem>
                  ))}
                </SidebarMenu>
              </SidebarGroupContent>
            </SidebarGroup>
          </SidebarContent>

          <SidebarFooter className="border-t border-sidebar-border">
            <SidebarMenu>
              <SidebarMenuItem>
                <SidebarMenuButton>
                  <UserIcon />
                  <span>Account</span>
                </SidebarMenuButton>
              </SidebarMenuItem>
              <SidebarMenuItem>
                <SidebarMenuButton>
                  <HelpCircleIcon />
                  <span>Help & Support</span>
                </SidebarMenuButton>
              </SidebarMenuItem>
            </SidebarMenu>
          </SidebarFooter>
        </Sidebar>

        <div className="flex-1 overflow-auto">
          <div className="flex flex-col gap-4 p-6">
            <div className="flex items-center gap-2">
              <h1 className="text-lg font-semibold">
                {mainNavItems.find((item) => item.id === activeItem)?.title ||
                  projectNavItems
                    .flatMap((item) => item.subItems || [])
                    .find((item) => item.id === activeItem)?.title ||
                  analyticsNavItems.find((item) => item.id === activeItem)
                    ?.title ||
                  'Dashboard'}
              </h1>
            </div>
            <div className="grid auto-rows-min gap-4 md:grid-cols-3">
              <div className="aspect-video rounded-xl bg-muted/50" />
              <div className="aspect-video rounded-xl bg-muted/50" />
              <div className="aspect-video rounded-xl bg-muted/50" />
            </div>
            <div className="h-[200px] rounded-xl bg-muted/50" />
          </div>
        </div>
      </SidebarProvider>
    </div>
  );
}

Icons Only

Collapsed sidebar showing only icons, expanding on hover.

View source
import {
  Sidebar,
  SidebarContent,
  SidebarGroup,
  SidebarGroupContent,
  SidebarMenu,
  SidebarMenuButton,
  SidebarMenuItem,
  SidebarProvider,
} from '@acronis-platform/shadcn-uikit/react';
import {
  CalendarIcon,
  HomeFolderIcon,
  MailboxIcon,
  SettingsIcon,
} from '@acronis-platform/shadcn-uikit';
export function SidebarIconsOnly() {
  return (
    <div className="h-[400px] border rounded-lg overflow-hidden flex">
      <SidebarProvider defaultOpen={true}>
        <Sidebar collapsible="none" className="w-16">
          <SidebarContent>
            <SidebarGroup>
              <SidebarGroupContent>
                <SidebarMenu>
                  <SidebarMenuItem>
                    <SidebarMenuButton
                      tooltip="Home"
                      className="justify-center"
                    >
                      <HomeFolderIcon />
                    </SidebarMenuButton>
                  </SidebarMenuItem>
                  <SidebarMenuItem>
                    <SidebarMenuButton
                      tooltip="Inbox"
                      className="justify-center"
                    >
                      <MailboxIcon />
                    </SidebarMenuButton>
                  </SidebarMenuItem>
                  <SidebarMenuItem>
                    <SidebarMenuButton
                      tooltip="Calendar"
                      className="justify-center"
                    >
                      <CalendarIcon />
                    </SidebarMenuButton>
                  </SidebarMenuItem>
                  <SidebarMenuItem>
                    <SidebarMenuButton
                      tooltip="Settings"
                      className="justify-center"
                    >
                      <SettingsIcon />
                    </SidebarMenuButton>
                  </SidebarMenuItem>
                </SidebarMenu>
              </SidebarGroupContent>
            </SidebarGroup>
          </SidebarContent>
        </Sidebar>
        <div className="flex-1 flex items-center justify-center p-4 bg-background">
          <p className="text-sm text-muted-foreground">
            Icon-only sidebar view
          </p>
        </div>
      </SidebarProvider>
    </div>
  );
}

With Badges

Sidebar menu items with notification badges.

View source
import {
  Sidebar,
  SidebarContent,
  SidebarGroup,
  SidebarGroupContent,
  SidebarMenu,
  SidebarMenuButton,
  SidebarMenuItem,
  SidebarProvider,
} from '@acronis-platform/shadcn-uikit/react';
import {
  CalendarIcon,
  FileTextIcon,
  HomeFolderIcon,
  MailboxIcon,
} from '@acronis-platform/shadcn-uikit';
export function SidebarWithBadges() {
  return (
    <div className="h-[400px] border rounded-lg overflow-hidden flex">
      <SidebarProvider>
        <Sidebar collapsible="none">
          <SidebarContent>
            <SidebarGroup>
              <SidebarGroupContent>
                <SidebarMenu>
                  <SidebarMenuItem>
                    <SidebarMenuButton>
                      <HomeFolderIcon />
                      <span>Dashboard</span>
                    </SidebarMenuButton>
                  </SidebarMenuItem>
                  <SidebarMenuItem>
                    <SidebarMenuButton>
                      <MailboxIcon />
                      <span>Messages</span>
                      <span className="ml-auto flex h-5 w-5 items-center justify-center rounded-full bg-white text-xs font-bold text-[#243143]">
                        12
                      </span>
                    </SidebarMenuButton>
                  </SidebarMenuItem>
                  <SidebarMenuItem>
                    <SidebarMenuButton>
                      <CalendarIcon />
                      <span>Events</span>
                      <span className="ml-auto flex h-5 w-5 items-center justify-center rounded-full bg-white text-xs font-bold text-[#243143]">
                        3
                      </span>
                    </SidebarMenuButton>
                  </SidebarMenuItem>
                  <SidebarMenuItem>
                    <SidebarMenuButton>
                      <FileTextIcon />
                      <span>Documents</span>
                      <span className="ml-auto rounded-full bg-[#DAE9AE] px-2 py-0 text-[10px] font-bold tracking-wider text-[#407009]">
                        NEW
                      </span>
                    </SidebarMenuButton>
                  </SidebarMenuItem>
                </SidebarMenu>
              </SidebarGroupContent>
            </SidebarGroup>
          </SidebarContent>
        </Sidebar>
        <div className="flex-1 flex items-center justify-center p-4 bg-background">
          <p className="text-sm text-muted-foreground">Main content area</p>
        </div>
      </SidebarProvider>
    </div>
  );
}

With Sections

Sidebar organized into labeled sections with group labels.

View source
import {
  Sidebar,
  SidebarContent,
  SidebarGroup,
  SidebarGroupContent,
  SidebarGroupLabel,
  SidebarMenu,
  SidebarMenuButton,
  SidebarMenuItem,
  SidebarProvider,
} from '@acronis-platform/shadcn-uikit/react';
import {
  HomeFolderIcon,
  SearchIcon,
  SettingsIcon,
} from '@acronis-platform/shadcn-uikit';
import { BarChartIcon } from '../icons/missing-icons';
export function SidebarWithSections() {
  return (
    <div className="h-[400px] border rounded-lg overflow-hidden flex">
      <SidebarProvider>
        <Sidebar collapsible="none">
          <SidebarContent>
            <SidebarGroup>
              <SidebarGroupLabel className="text-xs font-bold uppercase tracking-wider text-sidebar-foreground/70">
                Main
              </SidebarGroupLabel>
              <SidebarGroupContent>
                <SidebarMenu>
                  <SidebarMenuItem>
                    <SidebarMenuButton isActive>
                      <HomeFolderIcon />
                      <span>Dashboard</span>
                    </SidebarMenuButton>
                  </SidebarMenuItem>
                  <SidebarMenuItem>
                    <SidebarMenuButton>
                      <SearchIcon />
                      <span>Search</span>
                    </SidebarMenuButton>
                  </SidebarMenuItem>
                </SidebarMenu>
              </SidebarGroupContent>
            </SidebarGroup>

            <SidebarGroup>
              <SidebarGroupLabel className="text-xs font-bold uppercase tracking-wider text-sidebar-foreground/70">
                Tools
              </SidebarGroupLabel>
              <SidebarGroupContent>
                <SidebarMenu>
                  <SidebarMenuItem>
                    <SidebarMenuButton>
                      <BarChartIcon />
                      <span>Analytics</span>
                    </SidebarMenuButton>
                  </SidebarMenuItem>
                  <SidebarMenuItem>
                    <SidebarMenuButton>
                      <SettingsIcon />
                      <span>Settings</span>
                    </SidebarMenuButton>
                  </SidebarMenuItem>
                </SidebarMenu>
              </SidebarGroupContent>
            </SidebarGroup>
          </SidebarContent>
        </Sidebar>
        <div className="flex-1 flex items-center justify-center p-4 bg-background">
          <p className="text-sm text-muted-foreground">Content with sections</p>
        </div>
      </SidebarProvider>
    </div>
  );
}

API Reference

The Sidebar is a compound component. Wrap your layout with SidebarProvider and use the useSidebar hook to access collapse state. Key props on Sidebar: side ("left" | "right"), variant ("sidebar" | "floating" | "inset"), collapsible ("offcanvas" | "icon" | "none"). Sub-components include SidebarContent, SidebarGroup, SidebarGroupLabel, SidebarMenu, SidebarMenuItem, SidebarMenuButton, SidebarHeader, SidebarFooter, SidebarSeparator, and SidebarTrigger.

Edit on GitHub

On this page