Sidebar
A Tailwind CSS sidebar component for building dashboards, admin panels, and application layouts. See more sidebar examples.

<div class="sidebar">
<div class="sidebar-backdrop"></div>
<aside class="sidebar-panel">
<div class="sidebar-content">
<header class="sidebar-header">...</header>
<nav class="sidebar-menu">...</nav>
<footer class="sidebar-footer">...</footer>
</div>
</aside>
<main class="sidebar-page">
<p>Your content here</p>
</main>
</div>Left sidebar
By default, sidebars are positioned on the left side.
<div class="sidebar">
<div class="sidebar-backdrop"></div>
<aside class="sidebar-panel" id="my-sidebar">
<div class="sidebar-content">
<header class="sidebar-header">
<div class="menu-btn menu-btn-lg">Acme Inc</div>
</header>
<nav class="sidebar-menu">
<div class="menu-group">
<a href="#" class="menu-btn">Dashboard</a>
<a href="#" class="menu-btn">Projects</a>
<a href="#" class="menu-btn">Settings</a>
</div>
</nav>
</div>
</aside>
<main class="sidebar-page">
<header class="flex items-center gap-4 border-b p-4">
<button
class="btn btn-icon"
data-sp-toggle="sidebar"
data-sp-target="#my-sidebar"
>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="18" height="18" x="3" y="3" rx="2"/><path d="M9 3v18"/></svg>
</button>
<h1>Dashboard</h1>
</header>
<div class="p-6">
<p>Main content goes here.</p>
</div>
</main>
</div>Inset sidebar
Use sidebar-inset for a sidebar with an inset main content area.
<div class="sidebar sidebar-inset">
<div class="sidebar-backdrop"></div>
<aside class="sidebar-panel" id="my-sidebar">
<div class="sidebar-content">...</div>
</aside>
<main class="sidebar-page">
<p>Main content with rounded corners and shadow</p>
</main>
</div>Right sidebar
Use sidebar-right for a sidebar on the right side.
<div class="sidebar">
<div class="sidebar-backdrop"></div>
<main class="sidebar-page">
<p>Main content</p>
</main>
<aside class="sidebar-panel sidebar-right" id="right-sidebar">
<div class="sidebar-content">
<header class="sidebar-header">
<div class="menu-btn menu-btn-lg">Inspector</div>
</header>
<nav class="sidebar-menu">
<div class="menu-group">
<a href="#" class="menu-btn">Properties</a>
<a href="#" class="menu-btn">Styles</a>
<a href="#" class="menu-btn">Layers</a>
</div>
</nav>
</div>
</aside>
</div>Both sidebars
You can use both left and right sidebars together.
<div class="sidebar">
<div class="sidebar-backdrop"></div>
<aside class="sidebar-panel" id="left-sidebar">
<div class="sidebar-content">
<header class="sidebar-header">
<div class="menu-btn menu-btn-lg">Navigation</div>
</header>
<nav class="sidebar-menu">...</nav>
</div>
</aside>
<main class="sidebar-page">
<p>Main content</p>
</main>
<aside class="sidebar-panel sidebar-right" id="right-sidebar">
<div class="sidebar-content">
<header class="sidebar-header">
<div class="menu-btn menu-btn-lg">Inspector</div>
</header>
<nav class="sidebar-menu">...</nav>
</div>
</aside>
</div>Menu structure
The sidebar menu uses a structured hierarchy of groups, labels, and buttons.
<nav class="sidebar-menu">
<div class="menu-group">
<span class="menu-label">Platform</span>
<a href="#" class="menu-btn">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="7" height="7" x="3" y="3" rx="1"/><rect width="7" height="7" x="14" y="3" rx="1"/><rect width="7" height="7" x="14" y="14" rx="1"/><rect width="7" height="7" x="3" y="14" rx="1"/></svg>
Dashboard
</a>
<a href="#" class="menu-btn active">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915"/><circle cx="12" cy="12" r="3"/></svg>
Settings
</a>
</div>
<div class="menu-group">
<span class="menu-label">Projects</span>
<a href="#" class="menu-btn">Design Engineering</a>
<a href="#" class="menu-btn">Sales & Marketing</a>
</div>
</nav>Nested menus
Use menu-subgroup for nested navigation items. This works with the collapsible component to show/hide submenus. See it in action in the first sidebar example.
<nav class="sidebar-menu">
<div class="menu-group">
<button
class="menu-btn"
data-sp-toggle="collapsible"
data-sp-target="#submenu"
>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m7 11 2-2-2-2"/><path d="M11 13h4"/><rect width="18" height="18" x="3" y="3" rx="2" ry="2"/></svg>
Playground
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="ml-auto transition-transform in-aria-expanded:rotate-90"><path d="m9 18 6-6-6-6"/></svg>
</button>
<div id="submenu" class="collapsible-panel open">
<div class="menu-subgroup">
<a href="#" class="menu-btn menu-btn-sm">History</a>
<a href="#" class="menu-btn menu-btn-sm">Starred</a>
<a href="#" class="menu-btn menu-btn-sm">Settings</a>
</div>
</div>
</div>
</nav>Button sizes
Menu buttons come in three sizes.
<a href="#" class="menu-btn menu-btn-sm">Small</a>
<a href="#" class="menu-btn">Base (default)</a>
<a href="#" class="menu-btn menu-btn-lg">Large</a>Disabling animations
Add the no-animation class to disable animations.
<aside class="sidebar-panel no-animation">
<div class="sidebar-content">...</div>
</aside>How it works
The sidebar component provides a layout system with collapsible sidebars that work differently on mobile and desktop.
Structure
A sidebar layout consists of these parts:
.sidebar- Root container with flex layout and min-height.sidebar-backdrop- Overlay shown on mobile when sidebar is open.sidebar-panel- The sidebar panel element (defaults to left positioning).sidebar-content- Sticky inner wrapper for sidebar content.sidebar-page- Main content area
<div class="sidebar">
<div class="sidebar-backdrop"></div>
<aside class="sidebar-panel">
<div class="sidebar-content">
<!-- Sidebar content -->
</div>
</aside>
<main class="sidebar-page">
<!-- Page content -->
</main>
</div>Responsive behavior
The sidebar behaves differently based on screen size:
- Desktop (1024px and up): Sidebars are in-flow elements that push the main content. Toggling collapses/expands the sidebar using negative margins.
- Mobile (below 1024px): Sidebars are fixed overlays that slide in from the edge with a backdrop.
The breakpoint can be customized via the --breakpoint-sidebar CSS variable:
@theme inline {
--breakpoint-sidebar: 1024px;
}Opening and closing
Use data attributes to control the sidebar without writing JavaScript.
To toggle a sidebar, add data-sp-toggle="sidebar" and data-sp-target to a button:
<button data-sp-toggle="sidebar" data-sp-target="#my-sidebar">
Toggle Sidebar
</button>Clicking the backdrop or pressing Escape closes the mobile sidebar.
For programmatic control, import the sidebar module:
import { open, close, toggle } from "starting-point-ui/sidebar";
const sidebarPanel = document.querySelector("#my-sidebar");
toggle(sidebarPanel);
open(sidebarPanel);
close(sidebarPanel);Animation
The sidebar includes default animations. When opened on mobile, the JavaScript sets data-state="open" on the panel and backdrop. When closing, it sets data-state="closed" and waits for animations to complete before hiding the elements.
To disable animations, add no-animation to the sidebar panel:
<aside class="sidebar-panel no-animation">
<div class="sidebar-content">
<!-- Content -->
</div>
</aside>Class reference
All available classes for the sidebar component.
| Class | Description |
|---|---|
sidebar | Root container with flex layout and min-height |
sidebar-inset | Modifier for inset layout with rounded main content |
sidebar-panel | Main sidebar panel element, left-positioned by default |
sidebar-left | Explicit left positioning (applied by default) |
sidebar-right | Right positioning with right border |
sidebar-content | Sticky inner wrapper for sidebar content |
sidebar-header | Header section with padding |
sidebar-menu | Scrollable menu container |
sidebar-footer | Footer section with padding, pushed to bottom |
sidebar-page | Main content area |
sidebar-backdrop | Mobile overlay backdrop |
menu-group | Group container for menu items |
menu-subgroup | Nested group with left border |
menu-label | Section label text |
menu-btn | Menu button/link with hover states |
menu-btn-sm | Small menu button |
menu-btn-base | Base menu button size (default) |
menu-btn-lg | Large menu button |
menu-item | Non-interactive menu item without hover/active states |
menu-item-sm | Small menu item |
menu-item-lg | Large menu item |
no-animation | Disables default animations |
Data attributes
All data attributes for the sidebar component.
| Attribute | Description |
|---|---|
data-sp-toggle="sidebar" | Add to a button to toggle the sidebar panel |
data-sp-target="#id" | Specifies which sidebar panel to toggle |
data-state | Set to open or closed on panel and backdrop |