Brik Design System
Components

Section header

Centered, measure-capped section intro — composes ContentBlock and adds the horizontal measure that groups a title + description inside a band.

SectionHeader is the section intro that sits above a card grid, a CTA band, or a hero: an eyebrow / title / description, centered and capped to a readable width. It composes ContentBlock for the vertical slot rhythm (ADR-023) and adds the one thing ContentBlock deliberately does not own — the horizontal measure and alignment that group the intro inside its band. See ADR-032.

It exists so a section intro is one component with one measure, instead of a hand-rolled wrapper that caps text at 600px on one page and full-width on the next. Drop it inside the section's width-container (Page Grid) and it caps the text within — it never sets a band width itself.

Use it for

  • The centered heading + supporting line above a card grid or feature section
  • A CTA band's heading, supporting line, and button
  • Any section-level intro that reads as one centered (or left-anchored) text column

For a card's or CTA's inner text with no measure/centering of its own, use ContentBlock directly. For the page's own top-of-page header, use PageHeader.

Import

import { SectionHeader } from '@brikdesigns/bds';

Variants

Default

Centered, measure-md (60ch), title as <h2> at heading-lg — the section-intro default.

<SectionHeader
  title="What we do"
  description="From branding to websites to behind-the-scenes systems — we help you build a business that looks good and works better."
/>

Measure

measure caps the text column: sm (44ch) for a short intro, md (60ch, default), lg (72ch) for longer prose. The cap is the readable column inside the band — not the band width.

<SectionHeader measure="sm" title="Ready to get started?" description="Book a 15-minute walkthrough." />

Alignment

align="start" anchors the column to the band's start (left) instead of centering it; the measure cap still applies.

<SectionHeader align="start" title="Built for how you already work" description="Import your existing client list in minutes." />

With actions

The actions slot follows the description; in a centered header it centers under the text.

<SectionHeader
  title="Ready to get started?"
  description="Book a 15-minute walkthrough — no commitment required."
  actions={<Button variant="primary">Book a demo</Button>}
/>

On a filled brand band

onColor is forwarded straight to ContentBlock, which owns the swap to --text-on-color-dark. SectionHeader adds no colour CSS of its own — it still owns only measure and alignment. This is the supported route for a CTA band; the alternative it replaces was pushing a style={{ color }} through SectionHeader into a slot it does not own.

<SectionHeader
  onColor
  title="Get in touch"
  description="Starting a new project or want to collaborate with us?"
  actions={<Button variant="on-color">Let&apos;s Talk</Button>}
/>

White on --surface-brand-primary is 3.78:1 — AA-large (3:1), not AA (4.5:1); brand-primary fills are gated AA-large by policy (see Color Pairings, BDS-22 / ADR-015). The size="lg" title is large text; keep a band description short.

A measure is not a band. Never cap a section intro with a --content-width-* token or a raw px / percentage — that is what SectionHeader (or --measure-*) is for. The band width belongs to the section's width-container.

Props

PropTypeDefault
titleReactNode
subtitleReactNode
descriptionReactNode
actionsReactNode
align'center' | 'start''center'
measure'sm' | 'md' | 'lg''md'
titleAs'h1' | 'h2' | 'h3' | 'h4' | 'div' | 'p''h2'
size'sm' | 'md' | 'lg''lg'
onColorbooleanfalse

On this page

💬