Skip to content

Sidebar

The Sidebar is a vertical navigation bar that is typically placed on the left or right edge of an application.

Usage

html
<aside class="sidebar">
  <nav class="sidebar__nav">
    <ul class="sidebar__list">
      <li class="sidebar__item">
        <a href="#" class="sidebar__link">
          <span class="sidebar__icon">🏠</span>
          <span class="sidebar__text">Home</span>
        </a>
      </li>
      <li class="sidebar__item">
        <a href="#" class="sidebar__link">
          <span class="sidebar__icon">📊</span>
          <span class="sidebar__text">Dashboard</span>
        </a>
      </li>
      <li class="sidebar__item">
        <a href="#" class="sidebar__link">
          <span class="sidebar__icon">⚙️</span>
          <span class="sidebar__text">Settings</span>
        </a>
      </li>
    </ul>
  </nav>
</aside>

Variants

With Submenus

html
<aside class="sidebar">
  <nav class="sidebar__nav">
    <ul class="sidebar__list">
      <li class="sidebar__item">
        <a href="#" class="sidebar__link">
          <span class="sidebar__icon">🏠</span>
          <span class="sidebar__text">Home</span>
        </a>
      </li>
      <li class="sidebar__item">
        <button class="sidebar__link" aria-expanded="false">
          <span class="sidebar__icon">📊</span>
          <span class="sidebar__text">Dashboard</span>
          <span class="sidebar__arrow">▼</span>
        </button>
        <ul class="sidebar__submenu">
          <li class="sidebar__item">
            <a href="#" class="sidebar__link">Overview</a>
          </li>
          <li class="sidebar__item">
            <a href="#" class="sidebar__link">Statistics</a>
          </li>
        </ul>
      </li>
    </ul>
  </nav>
</aside>

With Animation

html
<aside class="sidebar sidebar--animated">
  <nav class="sidebar__nav">
    <ul class="sidebar__list">
      <li class="sidebar__item">
        <a href="#" class="sidebar__link">
          <span class="sidebar__icon">🏠</span>
          <span class="sidebar__text">Home</span>
        </a>
      </li>
    </ul>
  </nav>
</aside>

CSS Variables

css
:root {
  --sidebar-width: 250px;
  --sidebar-bg-color: #ffffff;
  --sidebar-text-color: #333333;
  --sidebar-hover-color: #f5f5f5;
  --sidebar-active-color: #e0e0e0;
  --sidebar-border-color: #e0e0e0;
  --sidebar-transition: all 0.3s ease;
}

Best Practices

Accessibility

  • Use semantic HTML elements
  • Add ARIA attributes
  • Ensure sufficient contrast
  • Implement keyboard navigation

Responsive Design

  • Use relative units
  • Test on different screen sizes
  • Optimize display on mobile devices
  • Consider touch targets

Performance

  • Minimize CSS
  • Optimize JavaScript
  • Avoid unnecessary nesting
  • Use CSS transitions instead of JavaScript animations

Integration

Astro

astro
---
import '@casoon/ui-lib/components/sidebar.css';
interface Props {
  items: Array<{
    icon: string;
    text: string;
    href?: string;
    submenu?: Array<{
      text: string;
      href: string;
    }>;
  }>;
  animated?: boolean;
}
const { items, animated = false } = Astro.props;
---

<aside class="sidebar" class:list={[animated && 'sidebar--animated']}>
  <nav class="sidebar__nav">
    <ul class="sidebar__list">
      {#each items as item}
        <li class="sidebar__item">
          {#if item.submenu}
            <button 
              class="sidebar__link" 
              aria-expanded="false"
            >
              <span class="sidebar__icon">{item.icon}</span>
              <span class="sidebar__text">{item.text}</span>
              <span class="sidebar__arrow">▼</span>
            </button>
            <ul class="sidebar__submenu">
              {#each item.submenu as subitem}
                <li class="sidebar__item">
                  <a href={subitem.href} class="sidebar__link">
                    {subitem.text}
                  </a>
                </li>
              {/each}
            </ul>
          {:else}
            <a href={item.href} class="sidebar__link">
              <span class="sidebar__icon">{item.icon}</span>
              <span class="sidebar__text">{item.text}</span>
            </a>
          {/if}
        </li>
      {/each}
    </ul>
  </nav>
</aside>

<style>
  .sidebar {
    width: var(--sidebar-width);
    background-color: var(--sidebar-bg-color);
    border-right: 1px solid var(--sidebar-border-color);
    height: 100vh;
    position: fixed;
    left: 0;
    top: 0;
    transition: var(--sidebar-transition);
  }
  
  .sidebar__nav {
    padding: 1rem 0;
  }
  
  .sidebar__list {
    list-style: none;
    padding: 0;
    margin: 0;
  }
  
  .sidebar__item {
    margin: 0.25rem 0;
  }
  
  .sidebar__link {
    display: flex;
    align-items: center;
    padding: 0.75rem 1rem;
    color: var(--sidebar-text-color);
    text-decoration: none;
    transition: var(--sidebar-transition);
  }
  
  .sidebar__link:hover {
    background-color: var(--sidebar-hover-color);
  }
  
  .sidebar__icon {
    margin-right: 0.75rem;
  }
  
  .sidebar__arrow {
    margin-left: auto;
  }
  
  .sidebar__submenu {
    list-style: none;
    padding: 0;
    margin: 0;
    max-height: 0;
    overflow: hidden;
    transition: var(--sidebar-transition);
  }
  
  .sidebar__item[aria-expanded="true"] .sidebar__submenu {
    max-height: 500px;
  }
  
  .sidebar--animated .sidebar__link {
    transform: translateX(-100%);
    opacity: 0;
  }
  
  .sidebar--animated .sidebar__link:nth-child(1) {
    transition-delay: 0.1s;
  }
  
  .sidebar--animated .sidebar__link:nth-child(2) {
    transition-delay: 0.2s;
  }
  
  .sidebar--animated .sidebar__link:nth-child(3) {
    transition-delay: 0.3s;
  }
</style>

Usage in an Astro component:

astro
---
import Sidebar from '../components/Sidebar.astro';
const navigationItems = [
  {
    icon: '🏠',
    text: 'Home',
    href: '/'
  },
  {
    icon: '📊',
    text: 'Dashboard',
    submenu: [
      {
        text: 'Overview',
        href: '/dashboard'
      },
      {
        text: 'Statistics',
        href: '/dashboard/statistics'
      }
    ]
  },
  {
    icon: '⚙️',
    text: 'Settings',
    href: '/settings'
  }
];
---

<Sidebar items={navigationItems} animated={true} />