Faber UI
Components

Sidebar

A composable sidebar system with collapsible modes and a trigger.

Sidebar is a composable sidebar system. It supports left or right placement, multiple variants, and collapsible modes, with a trigger to toggle the state.

Installation

Terminal
pnpm dlx shadcn@latest add https://faber-ui.vercel.app/r/sidebar.json

Usage

typescript
"use client";

import {
  Sidebar,
  SidebarContent,
  SidebarGroup,
  SidebarGroupContent,
  SidebarGroupLabel,
  SidebarHeader,
  SidebarInset,
  SidebarMenu,
  SidebarMenuButton,
  SidebarMenuItem,
  SidebarProvider,
  SidebarTrigger,
} from "@/components/ui/sidebar";
import { RiDashboardLine, RiSettingsLine } from "@remixicon/react";

export default function Example() {
  return (
    <SidebarProvider>
      <Sidebar>
        <SidebarHeader>Acme</SidebarHeader>
        <SidebarContent>
          <SidebarGroup>
            <SidebarGroupLabel>Application</SidebarGroupLabel>
            <SidebarGroupContent>
              <SidebarMenu>
                <SidebarMenuItem>
                  <SidebarMenuButton><RiDashboardLine />Dashboard</SidebarMenuButton>
                </SidebarMenuItem>
              </SidebarMenu>
            </SidebarGroupContent>
          </SidebarGroup>
        </SidebarContent>
      </Sidebar>
      <SidebarInset>
        <SidebarTrigger />
      </SidebarInset>
    </SidebarProvider>
  );
}

Examples

Default

Main content

Active item

API

Each part forwards every prop of what it is built on, including className and render where Base UI supports it. The props column lists only what Faber UI adds on top.

PartBuilt onProps
useSidebarHook—
SidebarProviderdata-slot="sidebar-wrapper"<div>HTML
  • defaultOpen? = trueboolean
  • open?boolean
  • onOpenChange?(open: boolean) => void
Sidebardata-slot="sidebar"<div>HTML
  • side? = "left""left" | "right"
  • variant? = "sidebar""sidebar" | "floating" | "inset"
  • collapsible? = "offcanvas""offcanvas" | "icon" | "none"
SidebarTriggerdata-slot="sidebar-trigger"ButtonFaber UI—
SidebarRaildata-slot="sidebar-rail"<button>HTML—
SidebarInsetdata-slot="sidebar-inset"<main>HTML—
SidebarInputdata-slot="sidebar-input"InputFaber UI—
SidebarHeaderdata-slot="sidebar-header"<div>HTML—
SidebarFooterdata-slot="sidebar-footer"<div>HTML—
SidebarSeparatordata-slot="sidebar-separator"SeparatorFaber UI—
SidebarContentdata-slot="sidebar-content"<div>HTML—
SidebarGroupdata-slot="sidebar-group"<div>HTML—
SidebarGroupLabeldata-slot="sidebar-group-label"<div>HTML—
SidebarGroupActiondata-slot="sidebar-group-action"<button>HTML—
SidebarGroupContentdata-slot="sidebar-group-content"<div>HTML—
SidebarMenudata-slot="sidebar-menu"<ul>HTML—
SidebarMenuItemdata-slot="sidebar-menu-item"<li>HTML—
SidebarMenuButtondata-slot="sidebar-menu-button"<button>HTML
  • isActive? = falseboolean
  • tooltip?string | React.ComponentProps<typeof TooltipContent>
  • variant? = "default""default" | "outline"
  • size? = "default""default" | "sm" | "lg"
SidebarMenuActiondata-slot="sidebar-menu-action"<button>HTML
  • showOnHover? = falseboolean
SidebarMenuBadgedata-slot="sidebar-menu-badge"<div>HTML—
SidebarMenuSkeletondata-slot="sidebar-menu-skeleton"<div>HTML
  • showIcon? = falseboolean
SidebarMenuSubdata-slot="sidebar-menu-sub"<ul>HTML—
SidebarMenuSubItemdata-slot="sidebar-menu-sub-item"<li>HTML—
SidebarMenuSubButtondata-slot="sidebar-menu-sub-button"<a>HTML
  • size? = "md""sm" | "md"
  • isActive? = falseboolean

Changelog

  1. v0.3.0Transitions using transition-control now animate, Drawer and Sheet use the drawer curve, the Sidebar collapse eases instead of moving linearly, and MessageScroller exits faster than it enters.patch
  2. v0.3.0Sheet, Drawer and Sidebar keep the border and the slide direction on the side named by side, which were reversed in right-to-left layouts.patch
  3. v0.3.0SidebarProvider ignores the toggle shortcut while typing in a field, accepts it with Shift or Caps Lock, and no longer re-subscribes on every toggle; Sidebar forwards className and props on mobile.patch
  4. v0.3.0useIsMobile reads the viewport through useSyncExternalStore, so Sidebar no longer mismatches on hydration when a page loads on a phone.patch
  5. v0.1.0Accessibility, correctness, and token fixes across the kit, from a full code-smell audit.minor
Full Sidebar history

Last updated on

On this page