Skip to content

Components

ContentHeader

Industrial design systems put the same block at the top of every workspace screen: where you are (breadcrumbs), what you're looking at (title + subtitle), and what you can do (actions). ContentHeader is that block.

Anatomy

Every slot is optional except title. The breadcrumb trail renders above; actions align to the end of the title row and wrap below it on narrow screens.

Open fullscreen
9:41
project.tsx
import { ContentHeader, Breadcrumbs, BreadcrumbItem } from "appshell-react";
import { Plus } from "lucide-react";

<ContentHeader
  breadcrumbs={
    <Breadcrumbs>
      <BreadcrumbItem label="Terra" href="/" />
      <BreadcrumbItem label="Projects" href="/projects" />
      <BreadcrumbItem label="Atlas launch" current />
    </Breadcrumbs>
  }
  title="Atlas launch"
  subtitle="14 open tasks · due Friday"
  actions={
    <button className="flex items-center gap-1.5 rounded-lg bg-primary px-3 py-2 text-sm font-medium text-primary-foreground">
      <Plus className="size-4" /> New task
    </button>
  }
/>

API

PropTypeDefaultDescription
title*ReactNode—Screen title.
subtitleReactNode—Supporting line under the title.
breadcrumbsReactNode—Typically a <Breadcrumbs> — rendered above the title.
actionsReactNode—Right-aligned controls — buttons, menus.
classNamestring—Extra classes.
PropTypeDefaultDescription
classNamestring—Extra classes.
children*ReactNode—BreadcrumbItems.
aria-labelstring—Accessible name of the trail. Defaults to the "Breadcrumb" label.
PropTypeDefaultDescription
label*string—Crumb text.
hrefstring—Renders as a link, through the LinkProvider component (plain <a> by default).
currentbooleanfalseMarks the current page: aria-current, no link styling.
onClick() => void—Click handler (renders a button when no href).
classNamestring—Extra classes.