docs / patterns / page-header

PageHeader

the block a view opens with. every part but the title is optional, so it degrades from a full dashboard hero all the way down to a plain headline.

intensity · structuresrsc · client

provenance

shaped from sisu-plus

layer

core / patterns

intensity

structures · organizes a region, stays out of the content

composition

the first block of a view, above a DashboardGrid or a content columnthe aside takes a PageHeaderMetric or panel-variant stats, controls take ToggleChipGroupsone per view. a section inside the page gets a SectionHeadingthe control tray configures the header, it is not a filter bar for the page

a11y

stats pair label and value in a dl · the closed control tray is inert · the scrim is aria-hiddenjest-axe
editablethe pencil toggles controlsOpen. the chips here add and remove stat tiles

Lut UniversitySummer 2026

Good afternoon, Mateusz.

Grade avg.
4.1
4 graded
Active courses
4
Enrolled
Credits left
104 cr
To target
Panel view

42%

Credit trajectory

metric and progress strip

Primary · 2024 curriculum

Software and Systems Engineering

2024 to 2028 · modified on 3 Jul 2026

76 / 193

credits earned · 39% of curriculum

104 cr to the degree minimumStudy right until 31 Jul 2028

compactthe aside is a second PageHeaderStats with panel tiles

Open

Summer to Spring 2025-2026

Open1 Jun 2025 to 31 May 2026

Course registration
3
Exam registration
0
Processed
3
background slot

bring your own background.

a gradient, a canvas, a shader. anything you can render.

1

prop

props

proptypedefaultnotes
eyebrowReactNodemono line above the title. a status word, a period, a breadcrumb.
titleReactNodethe headline.
titleAccentReactNodesecond phrase of the title, carrying the accent color.
accentColorstringaccent tokenany CSS color.
headingLevel"h1" | "h2" | "h3""h1"the heading element the title renders as.
metaReactNodeline under the title. dates, counts, a status dot.
childrenReactNodestat row under the meta line. pass PageHeaderStats.
asideReactNodethe right-hand column. a PageHeaderMetric, a panel row, a chart.
actionReactNodecontrol pinned to the top right. usually an icon-only Button.
controlsReactNoderevealed under the copy column while controlsOpen. pass ToggleChipGroups.
controlsOpenbooleanfalsewhether the control tray is expanded. controlled.
progressReactNodespans both columns, under them. a Progress, a ProgressRow, a segmented bar.
footerReactNodesmall print along the bottom.
backgroundReactNodepainted behind everything, under a scrim built from the surface token. no background, no scrim.
size"default" | "compact""default"compact shrinks the title and centers the two columns.

props

proptypedefaultnotes
PageHeaderStatsdlthe stat row. wraps PageHeaderStat children.
PageHeaderStatlabel, value, sub, tone, variantvariant: plain sits on the header, featured is the tinted lead tile, panel is a standalone card for the aside.
PageHeaderMetricvalue, total, captionthe big number. total renders as value / total at roughly half the size.

get it

bun add @usva-ui/reactcopy
usagecopy
import { PageHeader, PageHeaderMetric, PageHeaderStat, PageHeaderStats } from "@usva-ui/react/patterns/page-header";

<PageHeader
  eyebrow="Lut University · Summer 2026"
  title="Good afternoon,"
  titleAccent="Mateusz."
  aside={<PageHeaderMetric value={76} total={193} caption="credits earned" />}
>
  <PageHeaderStats>
    <PageHeaderStat variant="featured" tone="accent" label="Grade avg." value="4.1" sub="4 graded" />
    <PageHeaderStat label="Active courses" value="4" sub="Enrolled" />
  </PageHeaderStats>
</PageHeader>