Navbar

Top navigation bar with brand logo, nav link sections, active state, spacer for right-aligned items, and dark mode support.

Preview

Basic navbar

import { Navbar, NavbarBrand, NavbarSection, NavbarItem, NavbarSpacer } from '@/registry/ui-kit/tailwind-navbar/react'

function Example() {
  return (
    <Navbar>
      <NavbarBrand>Acme</NavbarBrand>
      <NavbarSection>
        <NavbarItem href="#" active>Dashboard</NavbarItem>
        <NavbarItem href="#">Projects</NavbarItem>
        <NavbarItem href="#">Team</NavbarItem>
      </NavbarSection>
      <NavbarSpacer />
      <NavbarSection>
        <NavbarItem href="#">Profile</NavbarItem>
      </NavbarSection>
    </Navbar>
  )
}

Component API

PropDefaultDescription
NavbarTop-level nav container with bottom border.
NavbarBrandLogo and brand name area. Accepts optional href to render as a link.
NavbarSectionFlex group for grouping nav items together.
NavbarItemIndividual nav link with hover and active states.
activefalseHighlights the nav item as the current page.
NavbarSpacerFlexible spacer to push items to the right.

Source Code

"use client";

/* ── Navbar ── */

interface NavbarProps {
  children: React.ReactNode;
  className?: string;
}

function Navbar({ children, className = "" }: NavbarProps) {
  return (
    <nav
      className={`border-b border-zinc-200 bg-white dark:border-zinc-800 dark:bg-zinc-900 ${className}`}
    >
      <div className="flex items-center gap-4 px-4 py-3">{children}</div>
    </nav>
  );
}

/* ── NavbarBrand ── */

interface NavbarBrandProps {
  children: React.ReactNode;
  className?: string;
  href?: string;
}

function NavbarBrand({ children, className = "", href }: NavbarBrandProps) {
  const classes = `flex items-center gap-2 text-lg font-semibold text-zinc-900 dark:text-zinc-100 ${className}`;

  if (href) {
    return (
      <a href={href} className={classes}>
        {children}
      </a>
    );
  }

  return <div className={classes}>{children}</div>;
}

/* ── NavbarSection ── */

interface NavbarSectionProps {
  children: React.ReactNode;
  className?: string;
}

function NavbarSection({ children, className = "" }: NavbarSectionProps) {
  return (
    <div className={`flex items-center gap-1 ${className}`}>{children}</div>
  );
}

/* ── NavbarItem ── */

interface NavbarItemProps
  extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
  active?: boolean;
  children: React.ReactNode;
  className?: string;
}

function NavbarItem({
  active = false,
  children,
  className = "",
  ...props
}: NavbarItemProps) {
  return (
    <a
      className={`rounded-lg px-3 py-2 text-sm font-medium transition-colors ${
        active
          ? "bg-zinc-100 text-zinc-900 dark:bg-zinc-800 dark:text-zinc-100"
          : "text-zinc-600 hover:bg-zinc-100 hover:text-zinc-900 dark:text-zinc-400 dark:hover:bg-zinc-800 dark:hover:text-zinc-100"
      } ${className}`}
      aria-current={active ? "page" : undefined}
      {...props}
    >
      {children}
    </a>
  );
}

/* ── NavbarSpacer ── */

function NavbarSpacer() {
  return <div className="flex-1" />;
}

export { Navbar, NavbarBrand, NavbarSection, NavbarItem, NavbarSpacer };
export default Navbar;