React Pro Sidebar
The ultimate sidebar component for React applications. Highly customizable, fully responsive, and effortless to integrate into any dashboard.
Documentation
Full documentation, guides and live examples are available at react-pro-sidebar.netlify.app.
Old versions
Live Preview
Screenshot

Installation
yarn
yarn add react-pro-sidebar
npm
npm install react-pro-sidebar
Requirements: React >= 18 (React 19 supported).
reactandreact-domare peer dependencies.
Migrating from v1
v2 removes the legacy hook API (useProSidebar, ProSidebarProvider), the
defaultCollapsed prop and the breakPoint="always" value, and requires
React 18+. See the migration guide for upgrade steps.
Usage
import { Sidebar, Menu, MenuItem, SubMenu } from 'react-pro-sidebar';
<Sidebar>
<Menu>
<SubMenu label="Charts">
<MenuItem> Pie charts </MenuItem>
<MenuItem> Line charts </MenuItem>
</SubMenu>
<MenuItem> Documentation </MenuItem>
<MenuItem> Calendar </MenuItem>
</Menu>
</Sidebar>;
Using React Router
You can make use of the component prop to integrate React Router link
Example Usage
import { Sidebar, Menu, MenuItem } from 'react-pro-sidebar';
import { NavLink } from 'react-router-dom';
<Sidebar>
<Menu
menuItemStyles={{
button: {
// NavLink adds the active class automatically,
// so we can use it to style the active menu item
[`&.active`]: {
backgroundColor: '#13395e',
color: '#b6c8d9',
},
},
}}
>
<MenuItem component={<NavLink to="/documentation" />}> Documentation</MenuItem>
<MenuItem component={<NavLink to="/calendar" />}> Calendar</MenuItem>
<MenuItem component={<NavLink to="/e-commerce" />}> E-commerce</MenuItem>
</Menu>
</Sidebar>;
Customization
We provide for each component rootStyles prop that can be used to customize the styles
its recommended using utility classes (sidebarClasses, menuClasses) for selecting target child nodes
Example usage
<Sidebar
rootStyles={{
[`.${sidebarClasses.container}`]: {
backgroundColor: 'red',
},
}}
>
// ...
</Sidebar>
For Menu component, in addition to rootStyles you can also use menuItemStyles prop for customizing all MenuItem & SubMenu components and their children
Type definition
interface MenuItemStyles {
root?: ElementStyles;
button?: ElementStyles;
label?: ElementStyles;
prefix?: ElementStyles;
suffix?: ElementStyles;
icon?: ElementStyles;
subMenuContent?: ElementStyles;
SubMenuExpandIcon?: ElementStyles;
}
type ElementStyles = CSSObject | ((params: MenuItemStylesParams) => CSSObject | undefined);
Example usage
<Sidebar>
<Menu
menuItemStyles={{
button: ({ level, active, disabled }) => {
// only apply styles on first level elements of the tree
if (level === 0)
return {
color: disabled ? '#f5d9ff' : '#d359ff',
backgroundColor: active ? '#eecef9' : undefined,
};
},
}}
>
//...
</Menu>
</Sidebar>
API
| Component | Prop | Type | Description | Default |
|---|---|---|---|---|
| Sidebar | collapsed | boolean |
Sidebar collapsed state | false |
| toggled | boolean |
Sidebar toggled state | false |
|
| width | number | string |
Width of the sidebar | 250px |
|
| collapsedWidth | number | string |
Width of the sidebar on collapsed state | 80px |
|
| backgroundColor | string |
Set background color for sidebar | rgb(249, 249, 249, 0.7) |
|
| image | string |
Url of the image to use in the sidebar background, need to apply transparency to background color | - | |
| breakPoint | xs | sm | md | lg | xl | xxl | all | string |
Set when the sidebar should trigger responsiveness behavior. Accepts a predefined breakpoint or a custom CSS value (ex: 450px) |
- | |
| transitionDuration | number |
Duration for the transition in milliseconds to be used in collapse and toggle behavior | 300 |
|
| rtl | boolean |
RTL direction | false |
|
| rootStyles | CSSObject |
Apply styles to sidebar element | - | |
| onBackdropClick | () => void |
Callback function to be called when backdrop is clicked | - | |
| onBreakPoint | (broken: boolean) => void |
Callback function to be called when the broken state changes | - | |
| Menu | closeOnClick | boolean |
If true and sidebar is in collapsed state, submenu popper will automatically close on MenuItem click |
false |
| popover | boolean |
If true, top-level SubMenus open as floating poppers even when the sidebar is expanded (instead of sliding open inline) |
false |
|
| accordion | boolean |
If true, only one top-level SubMenu can be open at a time; opening another closes the previously open one |
false |
|
| menuItemStyles | MenuItemStyles |
Apply styles to MenuItem and SubMenu components and their children | - | |
| renderExpandIcon | (params: { level: number; disabled: boolean; active: boolean; open: boolean; }) => React.ReactNode |
Render method for customizing submenu expand icon | - | |
| transitionDuration | number |
Transition duration in milliseconds to use when sliding submenu content | 300 |
|
| rootStyles | CSSObject |
Apply styles from Menu root element | - | |
| MenuItem | icon | ReactNode |
Icon for the menu item | - |
| active | boolean |
If true, the component is active |
false |
|
| disabled | boolean |
If true, the component is disabled |
- | |
| prefix | ReactNode |
Add a prefix to the menuItem | - | |
| suffix | ReactNode |
Add a suffix to the menuItem | - | |
| component | string | ReactElement |
A component used for menu button node, can be string (ex: 'div') or a component | - | |
| rootStyles | CSSObject |
Apply styles to MenuItem element | - | |
| SubMenu | label | string | ReactNode |
Label for the submenu | - |
| icon | ReactNode |
Icon for submenu | - | |
| defaultOpen | boolean |
Set if the submenu is open by default | false |
|
| open | boolean |
Set open value if you want to control the state | - | |
| active | boolean |
If true, the component is active. Also set automatically when any descendant is active |
false |
|
| disabled | boolean |
If true, the component is disabled |
- | |
| prefix | ReactNode |
Add a prefix to the submenu | - | |
| suffix | ReactNode |
Add a suffix to the submenu | - | |
| accordion | boolean |
If true, only one of this submenu's direct child SubMenus can be open at a time |
false |
|
| onOpenChange | (open: boolean) => void |
Callback function called when submenu state changes | - | |
| component | string | React.ReactElement |
A component used for menu button node, can be string (ex: 'div') or a component | - | |
| rootStyles | CSSObject |
Apply styles to SubMenu element | - |
License
MIT © Mohamed Azouaoui