Navbar

A responsive navigation header with a brand, links, text, and a collapsible menu.

Default

The default navbar composes a Navbar.Brand and a Navbar.Nav of Nav.Links.

tsx

import { Navbar, Nav } from "@hummingbirdui/react";

export default function NavbarDefault() {
  return (
    <Navbar expand="sm" className="bg-subtle">
      <Navbar.Brand href="#">Hummingbird</Navbar.Brand>
      <Navbar.Toggle />
      <Navbar.Collapse>
        <Navbar.Nav className="ms-auto">
          <Nav.Link href="#" active>
            Home
          </Nav.Link>
          <Nav.Link href="#">Features</Nav.Link>
          <Nav.Link href="#">Pricing</Nav.Link>
          <Nav.Link href="#" disabled>
            Disabled
          </Nav.Link>
        </Navbar.Nav>
      </Navbar.Collapse>
    </Navbar>
  );
}

Responsive collapse

Navbar.Toggle and Navbar.Collapse hide the menu behind a toggle below the expand breakpoint.

tsx

import { Navbar, Input, Button, Nav } from "@hummingbirdui/react";

export default function NavbarCollapseExample() {
  return (
    <Navbar expand="lg" className="bg-subtle">
      <Navbar.Brand href="#">Hummingbird</Navbar.Brand>
      <div className="flex items-center lg:order-1 gap-2">
        <Button variant="text" size="sm">
          Signin
        </Button>
        <Button size="sm" className="max-sm:hidden">
          Signup
        </Button>
        <Navbar.Toggle />
      </div>
      <Navbar.Collapse>
        <Navbar.Nav asChild>
          <div className="gap-2 lg:items-center w-full">
            <Nav.Link href="#" active>
              Home
            </Nav.Link>
            <Nav.Link href="#">Features</Nav.Link>
            <Nav.Link href="#">Pricing</Nav.Link>
            <Nav.Link href="#" disabled>
              Disabled
            </Nav.Link>
          </div>
        </Navbar.Nav>
      </Navbar.Collapse>
    </Navbar>
  );
}

Expand

The expand prop controls when the navbar expands horizontally. Supported values are sm, md, lg, xl, 2xl, and always.

tsx

import { Navbar, Nav } from "@hummingbirdui/react";

export default function NavbarExpand() {
  return (
    <Navbar expand="always" className="bg-subtle">
      <Navbar.Brand href="#">Hummingbird</Navbar.Brand>
      <Navbar.Nav asChild>
        <div className="gap-2">
          <Nav.Link href="#" active>
            Home
          </Nav.Link>
          <Nav.Link href="#">Pricing</Nav.Link>
        </div>
      </Navbar.Nav>
    </Navbar>
  );
}

Always collapsed

Omitting expand keeps the menu behind the toggle at every width, and duration on Navbar.Collapse tunes the open and close speed in milliseconds.

tsx

import { Navbar, Nav } from "@hummingbirdui/react";

export default function NavbarAlwaysCollapsed() {
  return (
    <Navbar className="bg-subtle">
      <Navbar.Brand href="#">Hummingbird</Navbar.Brand>
      <Navbar.Toggle />
      <Navbar.Collapse>
        <Navbar.Nav asChild>
          <div className="gap-2">
            <Nav.Link href="#" active>
              Home
            </Nav.Link>
            <Nav.Link href="#">Features</Nav.Link>
            <Nav.Link href="#">Pricing</Nav.Link>
          </div>
        </Navbar.Nav>
      </Navbar.Collapse>
    </Navbar>
  );
}

Scrollable

The scrollable prop on Navbar.Nav constrains the list height and scrolls its overflow.

tsx

import { Navbar, Nav } from "@hummingbirdui/react";

export default function NavbarScrollable() {
  return (
    <Navbar expand="lg" className="bg-subtle">
      <Navbar.Brand href="#">Hummingbird</Navbar.Brand>
      <Navbar.Toggle />
      <Navbar.Collapse>
        <Navbar.Nav scrollable asChild>
          <div className="max-h-24 gap-2">
            <Nav.Link href="#" active>
              Home
            </Nav.Link>
            <Nav.Link href="#">Features</Nav.Link>
            <Nav.Link href="#">Pricing</Nav.Link>
            <Nav.Link href="#">Docs</Nav.Link>
            <Nav.Link href="#">Blog</Nav.Link>
            <Nav.Link href="#">Support</Nav.Link>
          </div>
        </Navbar.Nav>
      </Navbar.Collapse>
    </Navbar>
  );
}

With text

Navbar.Text renders non-link content such as a signed-in label.

tsx

import { Navbar } from "@hummingbirdui/react";

export default function NavbarText_() {
  return (
    <Navbar expand="always" className="bg-subtle">
      <Navbar.Brand href="#">Hummingbird</Navbar.Brand>
      <Navbar.Text>
        Signed in as <strong>Mark</strong>
      </Navbar.Text>
    </Navbar>
  );
}

Custom toggle

Passing children to Navbar.Toggle overrides the default hamburger glyph.

tsx

import { Navbar, Nav } from "@hummingbirdui/react";
import { AlignJustify } from "lucide-react";

export default function NavbarCustomToggle() {
  return (
    <Navbar className="bg-subtle">
      <Navbar.Brand href="#">Hummingbird</Navbar.Brand>
      <Navbar.Toggle className="btn btn-icon btn-sm">
        <AlignJustify className="size-5" />
      </Navbar.Toggle>
      <Navbar.Collapse>
        <Navbar.Nav asChild>
          <div className="gap-2">
            <Nav.Link href="#" active>
              Home
            </Nav.Link>
            <Nav.Link href="#">Features</Nav.Link>
            <Nav.Link href="#">Pricing</Nav.Link>
          </div>
        </Navbar.Nav>
      </Navbar.Collapse>
    </Navbar>
  );
}

API Reference

The navbar is built on the Collapsible primitive; open, defaultOpen, and onOpenChange are forwarded to its root. The primitive's disabled prop is not forwarded.

PropTypeDefault
defaultOpenboolean
openboolean
onOpenChangefunction
expandenum
classNamestring
PropTypeDefault
scrollablebooleanfalse
asChildbooleanfalse
classNamestring

Navbar.Collapse wraps the Radix Collapsible content.

PropTypeDefault
asChildbooleanfalse
forceMountbooleantrue
durationnumber
classNamestring

Data attributeValues
[data-state]"open" | "closed"

CSS VariableDescription
--radix-collapsible-content-widthThe width of the content when it opens/closes. Named collapsible because it comes from the underlying Collapsible primitive.
--radix-collapsible-content-heightThe height of the content when it opens/closes. Named collapsible because it comes from the underlying Collapsible primitive.

Navbar.Toggle wraps the Radix Collapsible trigger. It renders the default hamburger Navbar.TogglerIcon unless children are passed, and sets aria-label="Toggle navigation" by default.

PropTypeDefault
asChildbooleanfalse
classNamestring

Data attributeValues
[data-state]"open" | "closed"
PropTypeDefault
asChildbooleanfalse
classNamestring

Navbar.Text accepts className. Navbar.TogglerIcon renders the default hamburger glyph and accepts standard svg props.

Styling

Hummingbird React navbar is styled entirely through Hummingbird's utility classes and CSS variables.

  • See the full list of available navbar classes in the Class overview.
  • Visit the CSS Variables documentation to explore all available variables.