On this page
Complete sidebar setup with navigation sections and expandable content.
# Don't let the demo get stuck closed
link_to("Force Open", "#", class: "btn btn-primary btn-sm float-right", data: { controller: "toggle-button", action: "click->toggle-button#on", "toggle-button-target-value": "demo_sidebar_complete" })
layout.build_sidebar(id: "demo_sidebar_complete") do |sidebar|
sidebar.title = "Application"
sidebar.build_navigation do |navigation|
navigation.build_link("Home", "#")
navigation.build_section("Projects", expanded: true) do |section|
section.path = "#"
section.build_link("All Projects", "#", active: true)
section.build_link("Active", "#")
section.build_link("Archived", "#")
end
navigation.build_section("Team") do |section|
section.path = "#"
section.build_link("Members", "#")
section.build_link("Roles", "#")
section.build_link("Invitations", "#")
end
navigation.build_section("Settings") do |section|
section.path = "#"
section.build_link("General", "#")
section.build_link("Billing", "#")
section.build_link("Integrations", "#")
end
end
end
<a class="btn btn-primary btn-sm float-right" data-controller="toggle-button" data-action="click->toggle-button#on" data-toggle-button-target-value="demo_sidebar_complete" href="#">Force Open</a>
<aside id="demo_sidebar_complete" data-controller="sidebar" data-sidebar-closed-cookie-value="demo_sidebar_complete_closed" class="sidebar sidebar-left open-lg">
<div class="sidebar-content">
<div class="sidebar-header">
<h2 class="sidebar-title">Application</h2>
<button data-action="click->sidebar#close" data-sidebar-id="demo_sidebar_complete" class="btn btn-naked btn-circular size-8" title="Close sidebar">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m15 18-6-6 6-6"></path></svg>
</button>
</div>
<nav class="sidebar-nav">
<a data-action="click->sidebar#closeUnlessLarge" class="sidebar-link sidebar-nav-link sidebar-link sidebar-nav-link" href="#">Home</a>
<div class="sidebar-section" data-controller="expandable" data-expandable-hidden-class="collapsed">
<a data-action="click->expandable#toggle" class="sidebar-section-toggle" href="#">
<svg class="expandable-chevron" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"></path></svg>
Projects
</a>
<div class="sidebar-section-content">
<a data-action="click->sidebar#closeUnlessLarge" class="sidebar-link sidebar-nav-link sidebar-link sidebar-nav-link" href="#">All Projects</a>
<a data-action="click->sidebar#closeUnlessLarge" class="sidebar-link sidebar-nav-link sidebar-link sidebar-nav-link" href="#">Active</a>
<a data-action="click->sidebar#closeUnlessLarge" class="sidebar-link sidebar-nav-link sidebar-link sidebar-nav-link" href="#">Archived</a>
</div>
</div>
<div class="sidebar-section collapsed" data-controller="expandable" data-expandable-hidden-class="collapsed">
<a data-action="click->expandable#toggle" class="sidebar-section-toggle" href="#">
<svg class="expandable-chevron" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"></path></svg>
Team
</a>
<div class="sidebar-section-content">
<a data-action="click->sidebar#closeUnlessLarge" class="sidebar-link sidebar-nav-link sidebar-link sidebar-nav-link" href="#">Members</a>
<a data-action="click->sidebar#closeUnlessLarge" class="sidebar-link sidebar-nav-link sidebar-link sidebar-nav-link" href="#">Roles</a>
<a data-action="click->sidebar#closeUnlessLarge" class="sidebar-link sidebar-nav-link sidebar-link sidebar-nav-link" href="#">Invitations</a>
</div>
</div>
<div class="sidebar-section collapsed" data-controller="expandable" data-expandable-hidden-class="collapsed">
<a data-action="click->expandable#toggle" class="sidebar-section-toggle" href="#">
<svg class="expandable-chevron" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"></path></svg>
Settings
</a>
<div class="sidebar-section-content">
<a data-action="click->sidebar#closeUnlessLarge" class="sidebar-link sidebar-nav-link sidebar-link sidebar-nav-link" href="#">General</a>
<a data-action="click->sidebar#closeUnlessLarge" class="sidebar-link sidebar-nav-link sidebar-link sidebar-nav-link" href="#">Billing</a>
<a data-action="click->sidebar#closeUnlessLarge" class="sidebar-link sidebar-nav-link sidebar-link sidebar-nav-link" href="#">Integrations</a>
</div>
</div>
</nav>
</div>
</aside>
Sidebars can be on the left or right side of the page.
left = layout.build_sidebar(position: :left) do |sidebar|
sidebar.title = "Left Sidebar"
sidebar.build_navigation do |navigation|
navigation.build_link("Navigation", "#")
navigation.build_link("Links", "#")
end
end
right = layout.build_sidebar(position: :right) do |sidebar|
sidebar.title = "Right Sidebar"
sidebar.build_navigation do |navigation|
navigation.build_link("Panel", "#")
navigation.build_link("Options", "#")
end
end
tag.div class: "w-full flex justify-between" do
safe_join [ render(left), render(right) ]
end
<div class="w-full flex justify-between">
<aside data-controller="sidebar" class="sidebar sidebar-left open-lg">
<div class="sidebar-content">
<div class="sidebar-header">
<h2 class="sidebar-title">Left Sidebar</h2>
<button data-action="click->sidebar#close" class="btn btn-naked btn-circular size-8" title="Close sidebar">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m15 18-6-6 6-6"></path></svg>
</button>
</div>
<nav class="sidebar-nav">
<a data-action="click->sidebar#closeUnlessLarge" class="sidebar-link sidebar-nav-link sidebar-link sidebar-nav-link" href="#">Navigation</a>
<a data-action="click->sidebar#closeUnlessLarge" class="sidebar-link sidebar-nav-link sidebar-link sidebar-nav-link" href="#">Links</a>
</nav>
</div>
</aside>
<aside data-controller="sidebar" class="sidebar sidebar-right open-lg">
<div class="sidebar-content">
<div class="sidebar-header">
<h2 class="sidebar-title">Right Sidebar</h2>
<button data-action="click->sidebar#close" class="btn btn-naked btn-circular size-8" title="Close sidebar">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m9 18 6-6-6-6"></path></svg>
</button>
</div>
<nav class="sidebar-nav">
<a data-action="click->sidebar#closeUnlessLarge" class="sidebar-link sidebar-nav-link sidebar-link sidebar-nav-link" href="#">Panel</a>
<a data-action="click->sidebar#closeUnlessLarge" class="sidebar-link sidebar-nav-link sidebar-link sidebar-nav-link" href="#">Options</a>
</nav>
</div>
</aside>
</div>
Group links into expandable sections for organizing larger navigation structures.
layout.build_sidebar do |sidebar|
sidebar.title = "Workspace"
sidebar.build_navigation do |navigation|
navigation.build_link("Dashboard", "#")
navigation.build_section("Projects", expanded: true) do |section|
section.path = "#"
section.build_link("Active", "#")
section.build_link("Archived", "#")
end
navigation.build_section("Reports") do |section|
section.path = "#"
section.build_link("Weekly", "#", active: true)
section.build_link("Monthly", "#")
end
end
end
<aside data-controller="sidebar" class="sidebar sidebar-left open-lg">
<div class="sidebar-content">
<div class="sidebar-header">
<h2 class="sidebar-title">Workspace</h2>
<button data-action="click->sidebar#close" class="btn btn-naked btn-circular size-8" title="Close sidebar">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m15 18-6-6 6-6"></path></svg>
</button>
</div>
<nav class="sidebar-nav">
<a data-action="click->sidebar#closeUnlessLarge" class="sidebar-link sidebar-nav-link sidebar-link sidebar-nav-link" href="#">Dashboard</a>
<div class="sidebar-section" data-controller="expandable" data-expandable-hidden-class="collapsed">
<a data-action="click->expandable#toggle" class="sidebar-section-toggle" href="#">
<svg class="expandable-chevron" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"></path></svg>
Projects
</a>
<div class="sidebar-section-content">
<a data-action="click->sidebar#closeUnlessLarge" class="sidebar-link sidebar-nav-link sidebar-link sidebar-nav-link" href="#">Active</a>
<a data-action="click->sidebar#closeUnlessLarge" class="sidebar-link sidebar-nav-link sidebar-link sidebar-nav-link" href="#">Archived</a>
</div>
</div>
<div class="sidebar-section collapsed" data-controller="expandable" data-expandable-hidden-class="collapsed">
<a data-action="click->expandable#toggle" class="sidebar-section-toggle" href="#">
<svg class="expandable-chevron" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"></path></svg>
Reports
</a>
<div class="sidebar-section-content">
<a data-action="click->sidebar#closeUnlessLarge" class="sidebar-link sidebar-nav-link sidebar-link sidebar-nav-link" href="#">Weekly</a>
<a data-action="click->sidebar#closeUnlessLarge" class="sidebar-link sidebar-nav-link sidebar-link sidebar-nav-link" href="#">Monthly</a>
</div>
</div>
</nav>
</div>
</aside>
Setting the ID of the sidebar will persist its state across page loads.
# Don't let the demo get stuck closed
link_to("Force Open", "#", class: "btn btn-primary btn-sm float-right", data: { controller: "toggle-button", action: "click->toggle-button#on", "toggle-button-target-value": "demo_sidebar_persisted_state" })
layout.build_sidebar(id: "demo_sidebar_persisted_state") do |sidebar|
sidebar.title = "Persisted State"
sidebar.build_navigation do |navigation|
navigation.build_link("Home", "#")
end
end
<a class="btn btn-primary btn-sm float-right" data-controller="toggle-button" data-action="click->toggle-button#on" data-toggle-button-target-value="demo_sidebar_persisted_state" href="#">Force Open</a>
<aside id="demo_sidebar_persisted_state" data-controller="sidebar" data-sidebar-closed-cookie-value="demo_sidebar_persisted_state_closed" class="sidebar sidebar-left open-lg">
<div class="sidebar-content">
<div class="sidebar-header">
<h2 class="sidebar-title">Persisted State</h2>
<button data-action="click->sidebar#close" data-sidebar-id="demo_sidebar_persisted_state" class="btn btn-naked btn-circular size-8" title="Close sidebar">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m15 18-6-6 6-6"></path></svg>
</button>
</div>
<nav class="sidebar-nav">
<a data-action="click->sidebar#closeUnlessLarge" class="sidebar-link sidebar-nav-link sidebar-link sidebar-nav-link" href="#">Home</a>
</nav>
</div>
</aside>
Use a table of contents for in-page navigation with nested lists.
layout.build_sidebar(position: :right) do |sidebar|
sidebar.title = "On this page"
sidebar.build_table_of_contents do |toc|
toc.build_link("Introduction", "#introduction")
toc.build_link("Getting Started", "#getting-started")
toc.build_list do |list|
list.build_link("Installation", "#installation")
list.build_link("Configuration", "#configuration")
list.build_list do |list|
list.build_link("Settings", "#settings")
end
end
toc.build_link("API Reference", "#api-reference")
end
end
<aside data-controller="sidebar" class="sidebar sidebar-right open-lg">
<div class="sidebar-content">
<div class="sidebar-header">
<h2 class="sidebar-title">On this page</h2>
<button data-action="click->sidebar#close" class="btn btn-naked btn-circular size-8" title="Close sidebar">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m9 18 6-6-6-6"></path></svg>
</button>
</div>
<ul class="sidebar-toc-list sidebar-toc-list-depth-0">
<li>
<a class="sidebar-link" href="#introduction">Introduction</a>
</li>
<li>
<a class="sidebar-link" href="#getting-started">Getting Started</a>
</li>
<li>
<ul class="sidebar-toc-list sidebar-toc-list-depth-1">
<li>
<a class="sidebar-link" href="#installation">Installation</a>
</li>
<li>
<a class="sidebar-link" href="#configuration">Configuration</a>
</li>
<li>
<ul class="sidebar-toc-list sidebar-toc-list-depth-2">
<li>
<a class="sidebar-link" href="#settings">Settings</a>
</li>
</ul>
</li>
</ul>
</li>
<li>
<a class="sidebar-link" href="#api-reference">API Reference</a>
</li>
</ul>
</div>
</aside>