Navigation

Breadcrumb.

Shows where a page sits in the site, in small mono uppercase with chevron separators.

Installation#

With the CLI

$npx lanterncn add breadcrumb

This also installs the Lantern theme and any Lantern UI components it depends on. The shadcn CLI works directly too: npx shadcn@latest add httptim/lantern-ui/breadcrumb. See Installation if your project is not set up yet.

Manually

  1. Install the dependencies

    npm install radix-ui lucide-react
  2. Copy the source into your project

    components/ui/breadcrumb.tsx
    import * as React from "react";
    import { Slot } from "radix-ui";
    import { ChevronRightIcon, MoreHorizontalIcon } from "lucide-react";
    
    import { cn } from "@/lib/utils";
    
    function Breadcrumb({ ...props }: React.ComponentProps<"nav">) {
      return <nav aria-label="breadcrumb" data-slot="breadcrumb" {...props} />;
    }
    
    function BreadcrumbList({ className, ...props }: React.ComponentProps<"ol">) {
      return (
        <ol
          data-slot="breadcrumb-list"
          className={cn(
            "flex flex-wrap items-center gap-1.5 font-mono text-[11px] tracking-[0.14em] break-words text-muted-foreground uppercase sm:gap-2",
            className,
          )}
          {...props}
        />
      );
    }
    
    function BreadcrumbItem({ className, ...props }: React.ComponentProps<"li">) {
      return <li data-slot="breadcrumb-item" className={cn("inline-flex items-center gap-1.5", className)} {...props} />;
    }
    
    function BreadcrumbLink({
      asChild,
      className,
      ...props
    }: React.ComponentProps<"a"> & { asChild?: boolean }) {
      const Comp = asChild ? Slot.Root : "a";
      return (
        <Comp
          data-slot="breadcrumb-link"
          className={cn(
            "rounded-sm transition-colors outline-none hover:text-primary focus-visible:ring-2 focus-visible:ring-ring/40",
            className,
          )}
          {...props}
        />
      );
    }
    
    function BreadcrumbPage({ className, ...props }: React.ComponentProps<"span">) {
      return (
        <span
          data-slot="breadcrumb-page"
          role="link"
          aria-disabled="true"
          aria-current="page"
          className={cn("text-foreground", className)}
          {...props}
        />
      );
    }
    
    function BreadcrumbSeparator({ children, className, ...props }: React.ComponentProps<"li">) {
      return (
        <li
          data-slot="breadcrumb-separator"
          role="presentation"
          aria-hidden="true"
          className={cn("text-[#5d6a5f] [&>svg]:size-3.5", className)}
          {...props}
        >
          {children ?? <ChevronRightIcon />}
        </li>
      );
    }
    
    function BreadcrumbEllipsis({ className, ...props }: React.ComponentProps<"span">) {
      return (
        <span
          data-slot="breadcrumb-ellipsis"
          role="presentation"
          aria-hidden="true"
          className={cn("flex size-6 items-center justify-center", className)}
          {...props}
        >
          <MoreHorizontalIcon className="size-4" />
          <span className="sr-only">More</span>
        </span>
      );
    }
    
    export {
      Breadcrumb,
      BreadcrumbEllipsis,
      BreadcrumbItem,
      BreadcrumbLink,
      BreadcrumbList,
      BreadcrumbPage,
      BreadcrumbSeparator,
    };
  3. Update the import paths to match your project

    The source imports cn from @/lib/utils.

Usage#

import {
  Breadcrumb,
  BreadcrumbEllipsis,
  BreadcrumbItem,
  BreadcrumbLink,
  BreadcrumbList,
  BreadcrumbPage,
  BreadcrumbSeparator,
} from "@/components/ui/breadcrumb";
<Breadcrumb>
  <BreadcrumbList>
    <BreadcrumbItem>
      <BreadcrumbLink href="/">Directory</BreadcrumbLink>
    </BreadcrumbItem>
    <BreadcrumbSeparator />
    <BreadcrumbItem>
      <BreadcrumbPage>Guestbook</BreadcrumbPage>
    </BreadcrumbItem>
  </BreadcrumbList>
</Breadcrumb>

The collapsed example uses the Dropdown Menu component, which you install separately.

Examples#

Collapsed with a dropdown