Title: SideNavbarComponent
---
The SideNavbarComponent renders a vertical navigation sidebar for the app shell. It supports navigation entries, a logo/title area, bottom navigation, and an optional collapsible mode that reduces the sidebar to icon-only display.
Configuration Options
All options are defined by the SideNavbarOptions interface.
| Option | Type | Default | Description |
|---|---|---|---|
| width | number | 280 | Width of the sidebar in pixels when expanded. |
| collapsedWidth | number | 64 | Width of the sidebar in pixels when collapsed. |
| collapsed | boolean | false | When true, the sidebar collapses to show only icons. Text labels, headers, language selectors, bottom content, and sub-entries are hidden. |
| onToggleCollapse | () => void | — | Callback invoked when the user clicks the collapse/expand toggle button. If omitted, the toggle button is not rendered. |
| bgColor | string | — | Background color of the sidebar. |
| textColor | string | — | Text color for sidebar content. |
| sidebarLogo | string | — | URL of a logo image shown at the top of the sidebar. Hidden when collapsed. |
| title | string | — | Title text shown at the top of the sidebar. Hidden when collapsed. |
| navigation | Navigation | — | Primary navigation entries. |
| bottomNavigation | Navigation | — | Navigation entries pinned to the bottom of the sidebar. |
| bottomContent | Snippet | — | A Svelte snippet rendered below the primary navigation entries. Hidden when collapsed. |
Collapsed Mode
When collapsed is true, the sidebar shrinks to collapsedWidth (default 64px) and hides all text, showing only entry icons. A smooth CSS transition (200ms ease-in-out) animates the width change.
In collapsed mode:
Navigation entry icons remain visible and are centered.
Each icon entry gains a right-side tooltip displaying its label, so users can still identify entries without text.
Section headers, the language selector, sub-entries, and bottomContent are hidden.
The logo and title area are hidden.
The collapse toggle button shows a tooltip with the "expand" label.
Collapse Toggle Button
When onToggleCollapse is provided, a toggle button is rendered at the bottom of the sidebar. Clicking it invokes the callback. It is accessible via data-testid="sidebar-collapse-toggle" and includes an appropriate aria-label that reflects the current state.
Persisting Collapse State
The sidebar itself is stateless with respect to collapse — it accepts collapsed as a prop. To persist the collapsed state across page loads, use sidebarCollapseService from the client package. This service stores the user's preference in localStorage under the key sidebar-collapsed, ensuring the sidebar restores its last known state on the next visit.
The service exposes two members:
| Member | Description |
|---|---|
| collapsed | Reactive boolean state reflecting the current collapsed value. |
| initialize() | Reads the stored value from localStorage and sets the initial state. Call this on mount. |
| toggle() | Flips the collapsed state and writes the new value to localStorage. |
Initializing the Service
Call sidebarCollapseService.initialize() on mount to restore the stored preference:
initialize() is safe to call in SSR contexts — it checks for browser before accessing localStorage and does nothing server-side.
Wiring to the Sidebar
Pass the reactive collapsed state and the toggle method to the sidebar options:
sidebar={{
navigation: myNavigation,
width: 280,
textColor: "var(--color-primary-content)",
collapsed: sidebarCollapseService.collapsed,
onToggleCollapse: () => sidebarCollapseService.toggle()
}}
Example
sidebarCollapseService.toggle()
}}
/>
Accessibility
The collapse toggle button has an aria-label that changes between the expand and collapse labels depending on current state.
Collapsed navigation entries expose their labels via data-tip tooltips (DaisyUI tooltip tooltip-right), ensuring keyboard and pointer users can identify each entry.