Skip to content
WingoUI
ComponentsTemplatesDocsPricingAI agentsBlogChangelogContact
Components
Buttons & Actions
ButtonButton GroupCopy ButtonDelete ButtonTheme ToggleToggleToggle Group
Inputs
Avatar UploadCalendarCheckboxColor PickerComboboxCountry SelectCron PickerCurrency InputDate PickerDate Range PickerDate Time PickerDuration PickerEmail InputEmoji PickerFile UploadFilter BuilderInputInput GroupListboxMasked InputMention InputMonth PickerMulti SelectNumber InputOTP InputPassword InputPhone InputRadio GroupRatingSearch InputSegmented ControlSelectSignature PadSliderSwitchTag InputTextareaTime PickerTimezone SelectTree Select
Forms
Address InputBooking WidgetCSV ImportFieldForm WizardInline EditInvoice line itemsRich Text EditorSchema Builder
Navigation
Back To TopBounce SidebarBreadcrumbCommand MenuGlobal SearchGooey NavHook SidebarNav MenuNav TabsPaginationProximity SidebarScroll ProgressSidebarStepsTable Of ContentsTabsTopbarUser MenuWorkspace Switcher
Overlays
Alert DialogContext MenuDialogDrawerDropdown MenuFamily DrawerHover CardPopoverShare DialogSheetShortcuts DialogTooltipTour
Feedback
AlertBannerCookie ConsentEmoji ReactionEmpty StateNotification BellNotification CenterProgressRoute ProgressSetup ChecklistSkeletonSpinnerToast
Data Display
Approval FlowAvatarBadgeCalendar ViewCode BlockComment ThreadContact cardCountdownDescription ListDiff ViewerFile ListFile managerFolderGanttJSON ViewerKbdLog ViewerMarkdownPresenceSchedulerTagTimelineTree View
Tables & Lists
Audit LogData TableDeal PipelineEditable GridKanbanListMembers tablePermissions MatrixTableTask ListVirtual List
Charts & Stats
Animated CounterArea chartBar chartDonut chartFunnel chartGaugeGitHub ActivityHeatmap calendarLeaderboardLine chartRadar chartRadial barSparklineStat CardTrackerTrend badge
Layout
AccordionApp ShellCardCollapsibleDetail LayoutEntity HeaderPage HeaderScroll AreaSeparatorSettings LayoutSplit ViewToolbar
Media
Audio PlayerCarouselCSV ViewerDOCX EditorDOCX ViewerExcel ViewerFile SystemImage compareImage CropperImage GalleryImage LightboxLocation MapPDF ViewerPowerPoint ViewerQR CodeStep PlayerVideo Player
AI Kit
Agent Status CardChat MessageChat ThreadChat WidgetConversation ListFluid OrbGrid RevealMatrix OrbModel PickerPrompt InputReasoning IndicatorRule BuilderSuggestion ChipsTool Call TimelineUsage MeterVoice InputWorkflow Canvas
Text & Effects
Background PatternGravity LettersMarqueeTerminalText AnimateText Rotate
Mobile
Action SheetBottom Tab BarFABHaptic ButtonHero HeaderInstall PromptLarge Title HeaderNotification BannerOnboarding CarouselPicker WheelPull To RefreshSlide To ConfirmSticky CTA BarSwipe DeckSwipeable Tabs
Commerce
Cart drawerCategory pickerCheckout stepsCoupon inputFavorite buttonFilter panelListing cardListing gridOrder trackerPricePrice rangePricing tableProduct galleryQuantity stepperReviewsSeller card
Marketing Sections
App Download SectionBlog Cards SectionCTA SectionFAQ SectionFeature GridFeature ShowcaseHero SectionIntegrations SectionLogo CloudMarketing FooterMarketing HeaderMarketing SectionNewsletter SectionPricing SectionStats SectionSteps SectionTeam SectionTestimonials SectionTimeline SectionVideo Section
Blocks
Admin Dashboard PageAdmin ShellAI Chat PageAPI Keys PageAutomation Builder PageCheckout PageCRM Contact PageCRM Pipeline PageError PagesInbox PageInvoice PageKPI DashboardListing Detail PageLogin PageMarketplace Home PageMarketplace Search PageMarketplace ShellMobile App HomeOnboarding FlowOrder History PagePost Listing WizardPricing PageProfile PageRegister PageSettings PageUsers Admin Page
Templates
About PageAcademy PageAccessibility PageAffiliate PageAgency PageAI Product PageAppointment Booking PageBlog PageBlog Post PageBug Bounty PageCareers PageChangelog PageCommunity PageCompare PageContact PageCustomer Story PageCustomers PageDemo Booking PageDevelopers PageDocs Home PageDownload PageEnterprise PageEvents PageExperts PageFAQ PageFeature PageGlossary PageHelp Article PageHelp Center PageHome Services PageImpact PageIntegration Detail PageIntegrations PageJob Detail PageLanding PageLaunch PageLegal PageManifesto PagePortfolio PagePress PageProduct Tour PagePromo PageReal Estate PageReferral PageResearch Report PageRestaurant PageRoadmap PageROI Calculator PageSecurity PageSolutions PageStartups PageStatus PageStorefront PageSwitch PageTemplate Gallery PageTravel PageWaitlist PageYear in Review Page
Hooks & Utilities
AI ChatChart kitCommerceDate utilsFile exportFile typesFiltersForm validationHapticsInvoicingMotion presetsNavigationNumber formatRelative timeRomanian locationsSpreadsheetText matchTonesUIProvideruseClipboarduseConsentuseControllableStateuseCooldownuseDebounceuseKeyboardInsetuseLocaleuseLongPressuseMediaControlsuseMediaQueryuseOverflowItemsusePersistedStateuseScrollEdgesuseScrollStateuseSelectionuseShortcutuseStickToBottom
GalleryTheme

Layout

Page Header

Layout

Page Header React component for Tailwind CSS v4

Entity HeaderScroll Area
Live props
Content
title
headingAs
description
backHref
backLabel
moreLabel
cancelLabel
Appearance
size
tone
color
border
State
loading
Layout
maxActions
mobileActions
Behavior
sticky
Code
import { PageHeader } from "@/components/ui/page-header"

<PageHeader />
  1. Home
  2. Components
  3. Layout
  4. Page Header
Pro

Page Header React component for Tailwind CSS v4

v1.2.1·Updated in 1.12.0

A React page header for admin screens: breadcrumb, title with avatar and badges, description, meta, actions that fold into a menu, and tabs.

Read where you are in the breadcrumb, then act: the primary action always stays in view at the end of the row, and the others fold one by one into a ⋯ menu as the window narrows (they come back when there is room). Actions that return a promise show a spinner until they finish. Tab walks the breadcrumb, the back button, every action and the ⋯ menu (arrow keys and Enter inside it, Escape closes it). With sticky set to condensed, scroll past the header and a glass bar with the title and the primary action slides down under the top bar. On a phone (or whenever the header itself is narrower than 512px, like in a side panel) the actions move under the title: the primary stays as a small button and the rest open from ⋯, as a bottom action sheet on phones (or stack full width with mobileActions set to stack); on phones the title shrinks and a ‹ back link replaces the breadcrumb.

Page Header is a Pro React component in the React layout components category, written in TypeScript for React 19 and Tailwind CSS v4. It installs as source with npx wingo-ui@latest add page-header, together with Avatar, Breadcrumb, Button, Dropdown Menu, Skeleton and 7 more and the npm packages motion and lucide-react.

Add to a project

Requirements: React 19 and Tailwind CSS v4, in Next.js (App Router or Pages), Vite or React Router. Installation guide · Next.js setup · Vite setup

npx wingo-ui@latest add page-header

Page Header is part of Pro, with 298 more Pro items: $8 a month or $150 once. 14-day refund before you download any Pro item. See plans

Usage

Import PageHeader from @/components/ui/page-header.

import { Pencil, Plus, Trash2 } from "lucide-react"
import { Badge } from "@/components/ui/badge"
import { NavTabs } from "@/components/ui/nav-tabs"
import { PageHeader } from "@/components/ui/page-header"

export function ClientHeader() {
  return (
    <PageHeader
      breadcrumb={[
        { label: "Home", href: "/" },
        { label: "Clients", href: "/clients" },
        { label: "Tech Solutions LLC" },
      ]}
      avatar={{ name: "Tech Solutions LLC" }}
      title="Tech Solutions LLC"
      badges={<Badge tone="success" dot>Active</Badge>}
      description="IT equipment distributor in Austin · EIN 12-3456789"
      meta={[{ label: "Client since Mar 12, 2024" }, { label: "Balance $12,480.00" }]}
      actions={[
        { label: "Edit", icon: <Pencil /> },
        { label: "Delete", icon: <Trash2 />, tone: "danger" },
        { label: "New invoice", icon: <Plus />, primary: true, href: "/invoices/new" },
      ]}
      tabs={
        <NavTabs
          items={[
            { label: "Overview", href: "/clients/tech-solutions" },
            { label: "Invoices", href: "/clients/tech-solutions/invoices", badge: 12 },
          ]}
        />
      }
      sticky="condensed"
    />
  )
}

Props

  • titledefault ""
    ReactNode

    The page title, rendered as the page's one <h1> (headingAs changes the element).

  • headingAsdefault "h1"
    "h1" | "h2" | "h3" | "div"

    The title's element. Keep h1 for the page's own header; use h2, h3 or div when the header sits inside a page that already has its h1 (a dialog, a card, a docs preview).

  • descriptiondefault ""
    ReactNode

    One or two lines under the title, capped at a readable width.

  • breadcrumb
    BreadcrumbEntry[] | ReactNode

    Entries render a Breadcrumb (it folds the middle when long and becomes a ‹ Parent link on phones). A node renders as is.

  • backHrefdefault ""
    string

    Adds a back button before the title (through NavLink). Below 640px it replaces the breadcrumb as a ‹ text link.

  • onBack
    () => void

    Runs when the back button is pressed; without backHref the back button is a plain button.

  • backLabeldefault "Back"
    string

    The back button's accessible name, and its visible text on phones ("Invoices" reads ‹ Invoices).

  • icon
    ReactNode

    An icon in a tinted tile before the title (40px, 48px at lg), colored by tone or color.

  • avatar
    { src?: string; name: string; radius?: AvatarRadius }

    A photo or initials before the title, wins over icon. radius md (default) for companies, full for people.

  • badges
    ReactNode

    Status badges after the title; they wrap under it when space runs out.

  • meta
    PageHeaderMeta[] | ReactNode

    Small facts in a wrapping row under the description: { id?, icon?, label }[], with 14px icons. A node renders as is.

  • actions
    PageHeaderAction[] | ReactNode

    { id?, label, icon?, onSelect?, href?, variant?, tone?, primary?, disabled? }[]. The primary one (or the last solid) stays visible, last in the row; the others are outline buttons that fold into ⋯ from the end while they do not fit, and always in the compact layout (header narrower than 512px: phones, side panels). onSelect returning a promise shows the button loading. A node renders as is, without folding.

  • tabs
    ReactNode

    NavTabs (or a Tabs list) sitting on the header's bottom border.

  • children
    ReactNode

    Extra content between the title row and the tabs, such as filters or a progress bar.

  • sizedefault "md"
    "sm" | "md" | "lg"

    Title 18 / 24 / 32px (18 / 22 / 26px on phones), with the icon tile and avatar scaled to match.

  • tonedefault "neutral"
    "neutral" | "brand" | "success" | "warning" | "danger" | "info"

    The media's color: the icon tile's soft tint, or the avatar's initials when there is no photo (neutral keeps the name-based color).

  • colordefault ""
    string

    Any CSS color for the icon tile or the avatar initials; replaces the tone. Leave empty to use the tone.

  • borderdefault true
    boolean

    The hairline under the header; tabs sit on it.

  • loadingdefault false
    boolean

    Skeletons in the shape of the title, description, meta and actions; the breadcrumb and tabs stay.

  • maxActionsdefault 0
    number

    The most buttons in the wide row, the primary included (1: only the primary, everything else in ⋯). The rest always open from the ⋯ menu, whatever fits. 0: as many as fit.

  • mobileActionsdefault "menu"
    "menu" | "stack"

    The compact layout (the header narrower than 512px, so every phone): the primary stays as a small button and the rest open from ⋯ (a bottom action sheet on phones), or every action stacks full width (48px, primary on top).

  • stickydefault "none"
    "none" | "condensed"

    condensed: once the header scrolls under the top bar, a 48px glass bar with the title and the primary action slides down and pins at top: var(--topbar-offset, 0px).

  • moreLabeldefault "More actions"
    string

    The ⋯ button's accessible name and the phone action sheet's hidden title.

  • cancelLabeldefault "Cancel"
    string

    The cancel row at the bottom of the phone action sheet.

  • scrollTarget
    HTMLElement | Window | RefObject<HTMLElement | null> | null

    What scrolls, for the condensed bar. Default: the nearest ScrollContainerProvider, else the window.

  • linkComponent
    (props: LinkComponentProps) => ReactNode

    The router link for link actions, the back link and the breadcrumb. Default: the LinkProvider's.

  • classNames
    Partial<Record<PageHeaderSlot, string>>

    Classes for the parts: breadcrumb, row, back, media, heading, title, badges, description, meta, metaItem, actions, more, tabs, condensed, condensedTitle, condensedAction.

Examples

Minimal

A title, a description and one primary action.

Back button

backHref instead of a breadcrumb: an icon button on desktop, a ‹ Invoices link on phones. Actions that return a promise load.

Settings page

An icon tile in the brand tone and no actions.

Sizes

sm, md and lg: 18 / 24 / 32px titles with the tile scaled to match.

Loading

Skeletons in the exact shape of the title, description, meta and actions.

Compact actions

Under 512px of width (every phone): the primary stays and the rest open from ⋯ (a sheet on phones), or stack full width.

Dependencies

motionlucide-reactavatarbreadcrumbbuttondropdown-menuskeletonuse-media-queryuse-overflow-itemsuse-scroll-statemotionnavigationtonesui-config

Files

  • components/ui/page-header.tsx

FAQ

Is the React Page Header component free?

The preview, props and docs are free; copying the source needs a Pro plan. See plans.

How do I install Page Header?

Run npx wingo-ui@latest add page-header. It also adds the Wingo UI items it builds on (Avatar, Breadcrumb, Button, Dropdown Menu, Skeleton and 7 more) and the npm packages motion and lucide-react. With shadcn, add the @wingo-ui registry with your API key, then run npx shadcn@latest add @wingo-ui/page-header.

How does Page Header behave on phones?

On a phone (or whenever the header itself is narrower than 512px, like in a side panel) the actions move under the title: the primary stays as a small button and the rest open from ⋯, as a bottom action sheet on phones (or stack full width with mobileActions set to stack); on phones the title shrinks and a ‹ back link replaces the breadcrumb.

See also

BreadcrumbNav TabsLarge Title HeaderTopbaruseOverflowItemshook

Used in

Entity HeaderAdmin Dashboard PageAPI Keys PageCRM Pipeline PageInvoice PageUsers Admin Page

More React layout components

Scroll AreaSettings LayoutSplit ViewToolbarSeparatorCard
All 12 React layout components
PreviousEntity HeaderNext Scroll Area
AAcme CRM
  1. Home
  2. Clients
  3. Tech Solutions LLC
Clients
TL

Tech Solutions LLC

ActiveVIP client
IT equipment distributor in Austin · EIN 12-3456789
  • Client since Mar 12, 2024
  • Owner: Emma Carter
  • Balance $12,480.00
  • Overview
  • Invoices12
  • Quotes3
  • Contacts
  • Files
  • Activity

/clients/tech-solutions · last action: none

Current balance$12,480.002 overdue invoices
Collected in 2026$86,240.50+18% vs 2025
Last paymentSep 18, 2026$6,049.50

Recent invoices

  • Invoice #2026-0412Sep 18, 2026
    $4,280.00Overdue
  • Invoice #2026-0398Sep 2, 2026
    $2,150.50Issued
  • Invoice #2026-0371Aug 14, 2026
    $6,049.50Paid
  • Invoice #2026-0344Jul 29, 2026
    $1,890.00Paid
  • Invoice #2026-0317Jul 10, 2026
    $3,320.00Paid

Activity

  • Emma Carter issued invoice #2026-0412

    Sep 18, 2026
  • Michael Reed sent quote #Q-2026-118

    Sep 11, 2026
  • Olivia Stone added the contact Ryan Mitchell

    Sep 5, 2026
  • Emma Carter updated the billing details

    Aug 28, 2026

Note

Usually pays in 30 days. Prefers invoices emailed to accounting@techsolutions.com with the purchase order attached. Master agreement renewed in March 2026, 5% volume discount above $20,000.00 per quarter.

Narrow the window: actions fold into ⋯ from the end, and on phones its sheet closes with “Cancel”. Set sticky to condensed and scroll.