Navbar

A top bar with a brand mark, a row of nav links, and optional trailing content.

Above the collapse breakpoint (lg), the bar reads as one row. Below, the nav and any trailing extras fold into a column behind a toggle. Resize the preview to a narrow width to see it fold. Drop the bar inside an .app-shell__main or at the top of <body>.

Basic

Wrap a .navbar__brand, a .navbar__toggle, and a .navbar__menu with its .navbar__nav list. Mark the current page with data-state="active" on the matching .navbar__button.

<nav class="navbar w-100" data-stisla-navbar style="border: 1px solid var(--st-border); border-radius: var(--st-radius);">
  <a class="navbar__brand" href="#">Acme</a>
  <button type="button" class="navbar__toggle" data-stisla-navbar-toggle aria-controls="navbarBasic" aria-expanded="false" aria-label="Toggle navigation">
    <i data-lucide="menu"></i>
  </button>
  <div class="navbar__menu" id="navbarBasic" data-state="closed">
    <ul class="navbar__nav">
      <li><a class="navbar__button" data-state="active" aria-current="page" href="#">Home</a></li>
      <li><a class="navbar__button" href="#">Features</a></li>
      <li><a class="navbar__button" href="#">Pricing</a></li>
      <li><a class="navbar__button" href="#">About</a></li>
    </ul>
  </div>
</nav>

Active and disabled

Active links carry data-state="active" (highlight chip); unreachable links carry aria-disabled="true" (dim + no pointer events). Hover is the soft accent chip; the active treatment is the highlight chip so the current row reads steadier than a transient hover.

<nav class="navbar w-100" data-stisla-navbar style="border: 1px solid var(--st-border); border-radius: var(--st-radius);">
  <a class="navbar__brand" href="#">Acme</a>
  <button type="button" class="navbar__toggle" data-stisla-navbar-toggle aria-controls="navbarStates" aria-expanded="false" aria-label="Toggle navigation">
    <i data-lucide="menu"></i>
  </button>
  <div class="navbar__menu" id="navbarStates" data-state="closed">
    <ul class="navbar__nav">
      <li><a class="navbar__button" href="#">Overview</a></li>
      <li><a class="navbar__button" data-state="active" aria-current="page" href="#">Reports</a></li>
      <li><a class="navbar__button" href="#">Settings</a></li>
      <li><a class="navbar__button" aria-disabled="true">Billing</a></li>
    </ul>
  </div>
</nav>

With status text

Drop any element inside .navbar__menu for a trailing status pill, workspace name, or counter. Without a nav before it, push the element to the trailing edge with margin-inline-start: auto.

<nav class="navbar w-100" data-stisla-navbar style="border: 1px solid var(--st-border); border-radius: var(--st-radius);">
  <a class="navbar__brand" href="#">Acme</a>
  <button type="button" class="navbar__toggle" data-stisla-navbar-toggle aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
    <i data-lucide="menu"></i>
  </button>
  <div class="navbar__menu" id="navbarText" data-state="closed">
    <span class="d-inline-flex align-items-center gap-2 ms-auto text-muted-foreground">
      <span class="d-inline-block" style="width: 0.375rem; height: 0.375rem; border-radius: 50%; background: var(--st-success);"></span>
      All systems normal
    </span>
  </div>
</nav>

Container

Drop a .container or .container-fluid as the bar's direct child to clamp inner content to the standard column widths. The bar still spans full width; the container takes over the inline padding so the inner row shares its inset with a matching container in the page body.

<nav class="navbar w-100" data-stisla-navbar style="border: 1px solid var(--st-border); border-radius: var(--st-radius);">
  <div class="container">
    <a class="navbar__brand" href="#">Acme</a>
    <button type="button" class="navbar__toggle" data-stisla-navbar-toggle aria-controls="navbarContainer" aria-expanded="false" aria-label="Toggle navigation">
      <i data-lucide="menu"></i>
    </button>
    <div class="navbar__menu" id="navbarContainer" data-state="closed">
      <ul class="navbar__nav">
        <li><a class="navbar__button" data-state="active" aria-current="page" href="#">Home</a></li>
        <li><a class="navbar__button" href="#">Features</a></li>
        <li><a class="navbar__button" href="#">Pricing</a></li>
      </ul>
    </div>
  </div>
</nav>

Dropdown menus inside .navbar__nav land with the dropdown component in Step 4. Until then, link rows that anchor a menu render as plain links.

Customization

Seventeen variables retune .navbar without touching component CSS. Override on the .navbar itself, on a parent scope, or on :root.

Layout

Variable Default Use
--navbar-padding-y calc(0.5rem * var(--st-density)) Vertical padding inside the bar
--navbar-padding-x calc(1rem * var(--st-density)) Horizontal padding inside the bar; zeroed when a container child is present
--navbar-gap calc(0.75rem * var(--st-density)) Space between brand, menu, and toggle
--navbar-bg var(--st-background) Bar background
--navbar-color var(--st-foreground) Bar foreground (brand + toggle inherit)

Button chip

Variable Default Use
--navbar-button-height 2.25rem Hard height of .navbar__brand and .navbar__button; multiplied by --st-density
--navbar-button-padding-x calc(0.75rem * var(--st-density)) Horizontal chip padding
--navbar-brand-padding-x var(--navbar-button-padding-x) Horizontal padding on .navbar__brand; defaults to the button chip's inset so brand text sits on the same x-grid as button text. Override to 0 for a flush brand.
--navbar-button-gap calc(0.25rem * var(--st-density)) Space between adjacent chips in .navbar__nav
--navbar-button-radius calc(var(--st-radius) - 0.25rem) Chip corner radius
--navbar-button-color var(--st-foreground) Rest text color
--navbar-button-hover-bg var(--st-accent) Hover + focus chip fill
--navbar-button-hover-color var(--st-accent-foreground) Hover + focus text color
--navbar-button-active-bg var(--st-highlight) Current-page chip fill (data-state="active")
--navbar-button-active-color var(--st-highlight-foreground) Current-page text color

Toggle + motion

Variable Default Use
--navbar-toggle-size 2.25rem Square hamburger button size; multiplied by --st-density
--navbar-transition 150ms ease Chip + toggle hover transition