Skip to main content
Use Case

Build a Navigation Bar with React and Tailwind CSS v4

Build a responsive, accessible navigation bar with mobile menu, dropdown, and active link states — using Ninna UI components and Tailwind v4.

Navigation bar requirements

A good navigation bar needs: responsive layout (desktop horizontal, mobile drawer), accessible dropdown menus, active link indicators, and proper ARIA (nav role, aria-current for active page).

1. Desktop navigation

Use HStack for horizontal layout with Link components:

import { Link } from "react-router";
import { HStack, Container } from "@ninna-ui/layout";
import { Button } from "@ninna-ui/primitives";
<Container>
<HStack justify="between" className="h-16">
<Link to="/" className="font-bold text-lg">MyApp</Link>
<HStack gap="6">
<Link to="/dashboard" className="text-sm hover:text-primary">Dashboard</Link>
<Link to="/settings" className="text-sm hover:text-primary">Settings</Link>
<Button color="primary" size="sm">Sign up</Button>
</HStack>
</HStack>
</Container>

2. Mobile drawer menu

Use Drawer from @ninna-ui/overlays for the mobile menu. It handles focus trapping and Escape to close:

import { Drawer } from "@ninna-ui/overlays";
import { IconButton } from "@ninna-ui/primitives";
import { Menu } from "lucide-react";
<Drawer>
<Drawer.Trigger asChild>
<IconButton variant="ghost" aria-label="Open menu" className="md:hidden">
<Menu className="size-5" />
</IconButton>
</Drawer.Trigger>
<Drawer.Content>
<VStack gap="4" className="p-6">
<Link to="/dashboard">Dashboard</Link>
<Link to="/settings">Settings</Link>
</VStack>
</Drawer.Content>
</Drawer>

3. Dropdown menu

Use DropdownMenu from @ninna-ui/overlays for user account menus:

import { DropdownMenu } from "@ninna-ui/overlays";
import { Avatar } from "@ninna-ui/primitives";
<DropdownMenu>
<DropdownMenu.Trigger asChild>
<button><Avatar name="Jane Doe" size="sm" /></button>
</DropdownMenu.Trigger>
<DropdownMenu.Content align="end">
<DropdownMenu.Item>Profile</DropdownMenu.Item>
<DropdownMenu.Item>Settings</DropdownMenu.Item>
<DropdownMenu.Separator />
<DropdownMenu.Item>Sign out</DropdownMenu.Item>
</DropdownMenu.Content>
</DropdownMenu>

4. Active link with aria-current

Use NavLink from react-router to set aria-current on the active page. This tells screen readers which page is current:

import { NavLink } from "react-router";
<NavLink to="/dashboard" className={({ isActive }) => isActive ? "text-primary font-medium" : "hover:text-primary"}>
Dashboard
</NavLink>

Component Docs

FAQ