Skip to content
Logic2BUI

Search docs

Search components and documentation

New
Menu

Sidebar

A composable, themeable app-shell sidebar for building dashboards.

Installation

npx logic2b@next add sidebar

Usage

Wrap your layout in SidebarProvider, place Sidebar and SidebarInset as siblings inside it, and use SidebarTrigger to toggle. State persists across reloads via a cookie and can be toggled with ⌘/Ctrl + B.

import {
  Sidebar,
  SidebarContent,
  SidebarHeader,
  SidebarInset,
  SidebarProvider,
  SidebarTrigger,
} from "@/components/ui/sidebar"

export function AppLayout() {
  return (
    <SidebarProvider>
      <Sidebar>
        <SidebarHeader>My App</SidebarHeader>
        <SidebarContent>{/* SidebarGroup, SidebarMenu... */}</SidebarContent>
      </Sidebar>
      <SidebarInset>
        <header>
          <SidebarTrigger />
        </header>
        {/* page content */}
      </SidebarInset>
    </SidebarProvider>
  )
}

Sidebar takes side (left | right), variant (sidebar | floating | inset) and collapsible (offcanvas | icon | none). On narrow viewports it renders as a Sheet automatically. Read the current state (state, open, isMobile, toggleSidebar) with the useSidebar() hook from any descendant.

Usage notes

SidebarTrigger is a Button that calls toggleSidebar(); it forwards all button props.

Examples

Icon rail

Floating variant

Accessibility

  • The whole sidebar can be toggled from the keyboard with ⌘/Ctrl + B, in addition to the SidebarTrigger button.
  • SidebarTrigger renders a labelled button (sr-only “Toggle Sidebar”) wired to toggleSidebar().
  • On mobile the sidebar becomes a Sheet, inheriting its focus trap and Esc-to-close behavior.
  • When collapsed to icon, add a tooltip to each SidebarMenuButton so the destination stays discoverable.

Live playground

Edit the component props and inspect the exact JSX before copying it. The preview loads only when this section enters the viewport.

Generated JSX
<SidebarProvider
  defaultOpen
  className="min-h-72 overflow-hidden rounded-lg border"
>
  <Sidebar
    collapsible="none"
    className="h-72"
  >
    <SidebarHeader>
      <SidebarInput
        placeholder="Search…"
        aria-label="Search navigation"
       />
    </SidebarHeader>
    <SidebarContent>
      <SidebarGroup>
        <SidebarGroupLabel>Platform</SidebarGroupLabel>
        <SidebarGroupContent>
          <SidebarMenu>
            <SidebarMenuItem>
              <SidebarMenuButton
                type="button"
                isActive
              >Registry</SidebarMenuButton>
            </SidebarMenuItem>
            <SidebarMenuItem>
              <SidebarMenuButton
                type="button"
              >Design tokens</SidebarMenuButton>
            </SidebarMenuItem>
            <SidebarMenuItem>
              <SidebarMenuButton
                type="button"
              >Benchmarks</SidebarMenuButton>
            </SidebarMenuItem>
          </SidebarMenu>
        </SidebarGroupContent>
      </SidebarGroup>
    </SidebarContent>
    <SidebarFooter>logic2b ui</SidebarFooter>
  </Sidebar>
  <SidebarInset
    className="min-h-72 p-6"
  >
    <SidebarTrigger />
    <p
      className="mt-6 text-sm text-muted-foreground"
    >Project workspace</p>
  </SidebarInset>
</SidebarProvider>

API reference

Generated from the public TypeScript exports in src/ui/sidebar.tsx.

View JSON

Sidebar

Component
Props: React.ComponentProps<"div"> & { side?: "left" | "right" variant?: "sidebar" | "floating" | "inset" collapsible?: "offcanvas" | "icon" | "none" }
PropTypeRequiredDefaultDescription
side"left" | "right"No"left"—
variant"sidebar" | "floating" | "inset"No"sidebar"—
collapsible"offcanvas" | "icon" | "none"No"offcanvas"—

SidebarContent

Component
Props: React.ComponentProps<"div">

SidebarFooter

Component
Props: React.ComponentProps<"div">

SidebarGroup

Component
Props: React.ComponentProps<"div">

SidebarGroupAction

Component
Props: React.ComponentProps<"button"> & { asChild?: boolean }
PropTypeRequiredDefaultDescription
asChildbooleanNofalse—

SidebarGroupContent

Component
Props: React.ComponentProps<"div">

SidebarGroupLabel

Component
Props: React.ComponentProps<"div"> & { asChild?: boolean }
PropTypeRequiredDefaultDescription
asChildbooleanNofalse—

SidebarHeader

Component
Props: React.ComponentProps<"div">

SidebarInput

Component
Props: React.ComponentProps<typeof Input>

SidebarInset

Component
Props: React.ComponentProps<"main">

SidebarMenu

Component
Props: React.ComponentProps<"ul">

SidebarMenuAction

Component
Props: React.ComponentProps<"button"> & { asChild?: boolean showOnHover?: boolean }
PropTypeRequiredDefaultDescription
asChildbooleanNofalse—
showOnHoverbooleanNofalse—

SidebarMenuBadge

Component
Props: React.ComponentProps<"div">

SidebarMenuButton

Component
Props: React.ComponentProps<"button"> & { asChild?: boolean isActive?: boolean tooltip?: string | React.ComponentProps<typeof TooltipContent> } & VariantProps<typeof sidebarMenuButtonVariants>
PropTypeRequiredDefaultDescription
asChildbooleanNofalse—
isActivebooleanNofalse—
variantnull | "default" | "outline"No"default"—
sizenull | "default" | "sm" | "lg"No"default"—
tooltipstring | React.ComponentProps<typeof TooltipContent>No——

SidebarMenuItem

Component
Props: React.ComponentProps<"li">

SidebarMenuSkeleton

Component
Props: React.ComponentProps<"div"> & { showIcon?: boolean }
PropTypeRequiredDefaultDescription
showIconbooleanNofalse—

SidebarMenuSub

Component
Props: React.ComponentProps<"ul">

SidebarMenuSubButton

Component
Props: React.ComponentProps<"a"> & { asChild?: boolean size?: "sm" | "md" isActive?: boolean }
PropTypeRequiredDefaultDescription
asChildbooleanNofalse—
size"sm" | "md"No"md"—
isActivebooleanNofalse—

SidebarMenuSubItem

Component
Props: React.ComponentProps<"li">

SidebarProvider

Component
Props: React.ComponentProps<"div"> & { defaultOpen?: boolean open?: boolean onOpenChange?: (open: boolean) => void }
PropTypeRequiredDefaultDescription
defaultOpenbooleanNotrue—
openbooleanNo——
onOpenChange(open: boolean) => voidNo——

SidebarRail

Component
Props: React.ComponentProps<"button">

SidebarSeparator

Component
Props: React.ComponentProps<typeof Separator>

SidebarTrigger

Component
Props: React.ComponentProps<typeof Button>

useSidebar

Hook
(): SidebarContextProps

Accessibility contract

Machine-readable behavior and consumer responsibilities for sidebar.

View JSON
Support
Authored behavior
Pattern
application navigation
Keyboard interactions for sidebar
KeysBehavior
Enter SpaceActivate the focused control.
Tab Shift+TabMove through sidebar controls and links.

Built-in semantics

  • Trigger buttons name their action; mobile mode uses a labelled sheet/dialog surface.

Consumer responsibilities

  • Wrap navigation links in a labelled nav landmark and mark the current route with aria-current.