# Minimal Navbar

> Minimal navbar for the Eudoxia wordmark: three text links, a ghost log in link and an outline get started button, collapsing to a Sheet menu in narrow containers.

A shadcn/ui block from the [@01orbital](https://01orbital.dev/?utm_source=shadcn.exchange) registry, listed on [shadcn.exchange](https://shadcn.exchange/r/01orbital/minimal-navbar-01).

- Page, with a live preview: https://shadcn.exchange/r/01orbital/minimal-navbar-01
- Screenshot: https://shadcn.exchange/shot/01orbital/minimal-navbar-01/light.png
- Registry item: https://01orbital.dev/r/minimal-navbar-01.json
- Categories: site-nav
- Listed: 2026-11-01, source last changed 2026-11-01

## Install

```bash
npx shadcn@latest add https://shadcn.exchange/r/01orbital/minimal-navbar-01.json
```

Run it in a project that has shadcn/ui set up. It adds the files below and installs what they depend on.

## Dependencies

- npm packages: `@phosphor-icons/react`, `cn`
- Registry items: `@01orbital/button`, `@01orbital/navbar`, `@01orbital/navigation-menu`, `@01orbital/sheet`

## Files

### `blocks/site-nav/minimal-navbar-01/index.tsx`

```tsx
"use client"

import { useState } from "react"
import { ListIcon } from "@phosphor-icons/react/dist/ssr"
import { cn } from "cn"

import {
  Navbar,
  NavbarActions,
  NavbarLink,
  NavbarLinks,
  NavbarLogo,
} from "@/components/site-nav/navbar"
import { Button, buttonVariants } from "@/components/ui/button"
import {
  NavigationMenuItem,
  NavigationMenuList,
} from "@/components/ui/navigation-menu"
import {
  Sheet,
  SheetContent,
  SheetFooter,
  SheetHeader,
  SheetTitle,
  SheetTrigger,
} from "@/components/ui/sheet"

// The copy: change text here, not in the markup.
const COPY = {
  brand: "Eudoxia.",
  homeLabel: "Eudoxia home",
  navLabel: "Main",
  links: [
    { label: "Product", href: "#" },
    { label: "Pricing", href: "#" },
    { label: "Docs", href: "#" },
  ],
  login: { label: "Log in", href: "#" },
  cta: { label: "Get started", href: "#" },
  menu: "Menu",
  openMenu: "Open menu",
} as const

export default function MinimalNavbar01() {
  // Controlled, so a link can close the sheet as it navigates.
  const [open, setOpen] = useState(false)
  const close = () => setOpen(false)

  return (
    <Navbar>
      <NavbarLogo href="#" aria-label={COPY.homeLabel}>
        {COPY.brand}
      </NavbarLogo>
      <NavbarLinks aria-label={COPY.navLabel}>
        <NavigationMenuList className="gap-8">
          {COPY.links.map((link) => (
            <NavigationMenuItem key={link.label}>
              <NavbarLink render={<a href={link.href} />}>
                {link.label}
              </NavbarLink>
            </NavigationMenuItem>
          ))}
        </NavigationMenuList>
      </NavbarLinks>
      <NavbarActions>
        <a
          href={COPY.login.href}
          data-slot="button"
          className={cn(
            buttonVariants({ variant: "ghost" }),
            "hidden @5xl/navbar:inline-flex"
          )}
        >
          {COPY.login.label}
        </a>
        <a
          href={COPY.cta.href}
          data-slot="button"
          className={cn(buttonVariants({ variant: "outline", size: "lg" }))}
        >
          {COPY.cta.label}
        </a>
        <Sheet open={open} onOpenChange={setOpen}>
          <SheetTrigger
            render={
              <Button
                variant="ghost"
                size="icon-lg"
                aria-label={COPY.openMenu}
                className="@5xl/navbar:hidden"
              />
            }
          >
            <ListIcon aria-hidden="true" />
          </SheetTrigger>
          <SheetContent>
            <SheetHeader>
              <SheetTitle>{COPY.menu}</SheetTitle>
            </SheetHeader>
            <nav aria-label={COPY.navLabel} className="grid gap-1 px-6">
              {COPY.links.map((link) => (
                <a
                  key={link.label}
                  href={link.href}
                  onClick={close}
                  data-slot="button"
                  className={cn(
                    buttonVariants({ variant: "ghost", size: "lg" }),
                    "justify-start"
                  )}
                >
                  {link.label}
                </a>
              ))}
            </nav>
            <SheetFooter>
              <a
                href={COPY.login.href}
                onClick={close}
                data-slot="button"
                className={cn(buttonVariants({ variant: "outline" }))}
              >
                {COPY.login.label}
              </a>
            </SheetFooter>
          </SheetContent>
        </Sheet>
      </NavbarActions>
    </Navbar>
  )
}
```
