Introducing PrimeReact v11-alpha 🎉Discover Now

useSidebar

Headless hooks for managing sidebar state, collapse behavior, layout coordination, and collapsible menu items.

Dashboard

Select an item from the sidebar to get started.

basic-demo

Usage#

import { useSidebar, useSidebarLayout, useSidebarMenuItem } from '@primereact/headless/sidebar';
const layout = useSidebarLayout({});
const sidebar = useSidebar({ id: 'nav', layout, collapsible: 'icon' });
 
return <aside {...sidebar.rootProps}>...</aside>;

The sidebar family splits concerns across three hooks: useSidebar drives a single sidebar's open/collapse state, useSidebarLayout coordinates multiple sidebars and the shared backdrop, and useSidebarMenuItem manages expandable submenus inside the sidebar. See Primitive for a component-based API.

Features#

  • Open/collapse lifecycle — controlled or uncontrolled open state with icon, offcanvas, or non-collapsible modes
  • Layout coordination — useSidebarLayout registers multiple sidebars, exposes a shared backdrop, and drives cross-sidebar toggles
  • Hover-to-open — optional pointer-enter expansion with configurable open/close delays
  • Positional variants — left/right placement plus sidebar, floating, and inset visual variants
  • Collapsible menu items — useSidebarMenuItem exposes expandable submenu state with spread-ready trigger and content props
  • Data-driven styling — data-state, data-variant, data-collapsible, data-side, and data-overlay attributes make CSS targeting declarative

Working with callbacks#

Composing layout with sidebars#

Create a layout once and pass it to each sidebar that should coordinate backdrop, toggles, and registration.

const layout = useSidebarLayout({});
 
const left = useSidebar({ id: 'nav', layout, side: 'left' });
const right = useSidebar({ id: 'details', layout, side: 'right' });
 
<li>
    <button {...triggerProps}>Menu Item</button>
    {state.open && <ul {...contentProps}>...</ul>}
</li>;

Controlled open state#

Drive the sidebar from external state by pairing open with onOpenChange.

const [open, setOpen] = React.useState(true);
 
const sidebar = useSidebar({
    open,
    onOpenChange: (e) => setOpen(e.value)
});

Opening on hover#

Enable openOnHover for icon-collapsed sidebars that should reveal on pointer enter. Tune the timing with hoverOpenDelay and hoverCloseDelay to reduce flicker.

const sidebar = useSidebar({
    collapsible: 'icon',
    openOnHover: true,
    hoverOpenDelay: 100,
    hoverCloseDelay: 200
});

Triggering sidebars from elsewhere#

Use the layout's imperative helpers to toggle or collapse sidebars from buttons outside the aside — for example a header toggle.

<button onClick={() => layout.toggle('nav')}>Toggle nav</button>
<button onClick={() => layout.collapse()}>Collapse all</button>

Collapsible menu items#

useSidebarMenuItem returns triggerProps and contentProps for expandable groups. Render the content conditionally from state.open.

const { state, triggerProps, contentProps } = useSidebarMenuItem({
    collapsible: true,
    defaultOpen: false
});

Styling with data attributes#

rootProps from useSidebar expose state through data-* attributes so CSS can react without className juggling.

AttributeValues
data-stateexpanded | collapsed
data-variantsidebar | floating | inset
data-collapsibleoffcanvas | icon | (empty when expanded)
data-collapsible-modeoffcanvas | icon | none (always present)
data-sideleft | right
data-overlaypresent when overlay is true
[data-scope='sidebar'][data-state='collapsed'][data-collapsible='icon'] {
    width: 3rem;
}
 
[data-scope='sidebar'][data-side='right'] {
    border-left: 1px solid var(--p-content-border-color);
}

API#

useSidebar#

NameTypeDefault
layoutuseSidebarLayoutExposes—
Layout context for registering/notifying within a Sidebar.Layout.
idstring—
Unique identifier for the sidebar, used by Trigger target.
side"left" | "right"'left'
Sidebar position.
variant"sidebar" | "floating" | "inset"'sidebar'
Visual variant of the sidebar.
collapsible"icon" | "none" | "offcanvas"'icon'
Collapse behavior.
overlaybooleanfalse
Whether the sidebar overlays content instead of pushing it.
openboolean—
Controls the open state of the sidebar.
defaultOpenbooleantrue
Initial open state.
onOpenChange(event: useSidebarOpenChangeEvent) => void—
Callback when the open state changes.
openOnHoverbooleanfalse
Whether the sidebar opens on hover.
hoverOpenDelaynumber50
Delay before opening on hover (ms).
hoverCloseDelaynumber100
Delay before closing on hover leave (ms).
dismissablebooleantrue
Whether clicking the backdrop closes the sidebar.
hideOnOutsideClickbooleantrue
When `overlay` is true, clicking inside the `Sidebar.Main` area collapses the sidebar. Clicks on a `Sidebar.Trigger` are excluded so opening via the trigger is not immediately undone.
widthstring'16rem'
Sidebar width when expanded.
iconWidthstring'3rem'
Sidebar width when collapsed to icon mode.

useSidebarLayout#

NameTypeDefault

useSidebarMenuItem#

NameTypeDefault
collapsibleboolean—
openboolean—
defaultOpenboolean—
disabledboolean—
onOpenChange(event: { originalEvent: SyntheticEvent; value: boolean }) => void—

Accessibility#

Arrow keys navigate items, Enter activates links, and Right/Left expand or collapse nested groups. See Primitive for full WAI-ARIA compliance details.