bx

Sidebar

A composable, themeable and customizable sidebar component.

Dashboard
Main content zone.
tsx
<SidebarProvider>
  <Sidebar>
    <SidebarHeader>Brand</SidebarHeader>
    <SidebarContent>
      <SidebarGroup>
        <SidebarMenu>
          <SidebarMenuItem>
            <SidebarMenuButton href="/">Home</SidebarMenuButton>
          </SidebarMenuItem>
        </SidebarMenu>
      </SidebarGroup>
    </SidebarContent>
  </Sidebar>
  <SidebarInset>
    <SidebarTrigger />
    <main>...</main>
  </SidebarInset>
</SidebarProvider>

Sidebar — barre latérale d'application (nav principale) avec header, footer, groupes de menu items, collapsibility, mobile off-canvas. Le pattern shadcn de référence pour un dashboard multi-pages.

Structure : SidebarProvider (root) > Sidebar (left/right) + SidebarInset (main content zone). Sidebar contient Header/Content/Footer, avec des SidebarGroup > SidebarMenu > SidebarMenuItem > SidebarMenuButton.

Installation

Terminal
$ bext ui add sidebar

Usage

tsx
import { SidebarProvider, Sidebar, SidebarHeader, SidebarContent, SidebarGroup, SidebarMenu, SidebarMenuItem, SidebarMenuButton, SidebarInset, SidebarTrigger } from "@bext-stack/ui/primitives"

<SidebarProvider>
  <Sidebar>
    <SidebarHeader>Acme Corp</SidebarHeader>
    <SidebarContent>
      <SidebarGroup>
        <SidebarMenu>
          <SidebarMenuItem>
            <SidebarMenuButton isActive href="/">Home</SidebarMenuButton>
          </SidebarMenuItem>
        </SidebarMenu>
      </SidebarGroup>
    </SidebarContent>
  </Sidebar>
  <SidebarInset>
    <SidebarTrigger />
    <main>Content</main>
  </SidebarInset>
</SidebarProvider>

Anatomy

<SidebarProvider>
  <Sidebar>
    ├── <SidebarHeader>Brand</SidebarHeader>
    ├── <SidebarContent>
    │   └── <SidebarGroup>
    │       ├── <SidebarGroupLabel>Platform</SidebarGroupLabel>
    │       └── <SidebarMenu>
    │           └── <SidebarMenuItem>
    │               └── <SidebarMenuButton href="/">Home</SidebarMenuButton>
    └── <SidebarFooter>Profile</SidebarFooter>
  </Sidebar>
  <SidebarInset>
    ├── <SidebarTrigger />
    └── {main content}
  </SidebarInset>
</SidebarProvider>

API Reference

SidebarProvider

Prop Type Default Description
defaultOpen boolean true undefined
children ReactNode undefined
Prop Type Default Description
side "left" | "right" "left" undefined
variant "sidebar" | "floating" | "inset" "sidebar" undefined
collapsible "offcanvas" | "icon" | "none" "offcanvas" undefined

SidebarHeader / SidebarFooter / SidebarContent

Prop Type Default Description
children ReactNode undefined

SidebarGroup

Prop Type Default Description
children ReactNode undefined

SidebarGroupLabel

Prop Type Default Description
children ReactNode Label uppercase muted au-dessus du groupe.

SidebarMenu

Prop Type Default Description
children ReactNode undefined

SidebarMenuItem

Prop Type Default Description
children ReactNode undefined

SidebarMenuButton

Prop Type Default Description
href string undefined
isActive boolean undefined
children ReactNode undefined

SidebarTrigger

Prop Type Default Description
className string Bouton hamburger pour toggle open/collapsed.

SidebarInset

Prop Type Default Description
children ReactNode Zone content à droite de la sidebar.

Data Attributes

Attributs qu'on peut cibler en CSS custom pour override le style par état.

Attribute On Values Description
data-ui="sidebar-trigger" SidebarTrigger undefined undefined
data-state Sidebar root "open" | "collapsed" undefined
data-side Sidebar root "left" | "right" undefined
data-active SidebarMenuButton "true" | "false" undefined

Keyboard

Key Action
Ctrl/Cmd + B Toggle open/collapsed (raccourci recommandé — à câbler).

Accessibility

Sidebar porte <nav aria-label="Main">. Les MenuButton sont des <a> ou <button> avec aria-current="page" pour l'item actif.

Try it live Open in play

Edit this example live in the bext playground — it compiles and runs entirely in your browser.

src/app/page.tsx 1 file · react · runs in your browser
The React idiom — same UI, for comparison.