Sidebar
A composable, themeable and customizable sidebar component.
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
$ bext ui add sidebar
Copy and paste the following into src/components/ui/sidebar.tsx.
This component is interactive — make sure the shared island is loaded (see Islands). It reacts to data-ui="sidebar" hooks.
Usage
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 |
Sidebar
| 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.
Edit this example live in the bext playground — it compiles and runs entirely in your browser.
On This Page