Elements
Section title
View in FigmaAn optional eyebrow (tagline or breadcrumbs), title, and description, stacked with size-aware spacing.
Install
npx shadcn@latest add @alix/sectionTitlePreview
Plans for every team
Usage
<SectionTitle
tagline={{ text: "Pricing" }}
title="Plans for every team"
description="Start free, upgrade when you grow."
/>
<ButtonGroup
primaryAction={<Button>Get started</Button>}
secondaryAction={<Button variant="outline">Contact sales</Button>}
/>Examples
Size scale
Choose the heading size by section prominence while keeping the same data contract.
Enterprise transformation
Performance improvement
Transaction services
Risk review
<div className="grid w-full max-w-4xl gap-8 md:grid-cols-2">
<SectionTitle
headingSize="xl"
title="Enterprise transformation"
description="Large section leads for major page moments."
align="start"
/>
<SectionTitle
headingSize="lg"
title="Performance improvement"
description="Default section leads for most content bands."
align="start"
/>
<SectionTitle
headingSize="md"
title="Transaction services"
description="Medium section leads for tighter page groups."
align="start"
/>
<SectionTitle
headingSize="sm"
title="Risk review"
description="Small section leads for compact supporting content."
align="start"
/>
</div>Rich description
Pass block content when a CMS renderer returns multiple paragraphs instead of one string; actions compose below via ButtonGroup.
Work with senior operators
Our teams join clients when the choices are urgent and the operating facts are still moving.
The model keeps leadership close to the work from diagnosis through delivery.
<SectionTitle
title="Work with senior operators"
description={
<>
<p>
Our teams join clients when the choices are urgent and the
operating facts are still moving.
</p>
<p>
The model keeps leadership close to the work from diagnosis
through delivery.
</p>
</>
}
align="start"
/>
<ButtonGroup
primaryAction={<Button>Meet our people</Button>}
secondaryAction={<Button variant="outline">View open roles</Button>}
/>Insight row recipe
Lead a card row with SectionTitle and a ButtonGroup when the section needs one action pair above repeated content.
Latest insights

Liquidity decisions need one operating rhythm
How leadership teams connect cash, margin, and working capital in the same cadence.

Diligence that survives day one
What deal teams can carry from findings into action without losing momentum.

Supply shocks are finance events
A practical view of translating disruption into inventory and cash decisions.
<div className="w-full max-w-5xl space-y-8">
<div className="flex flex-col items-start gap-6">
<SectionTitle
title="Latest insights"
description="Briefings for leaders working through liquidity, diligence, and operational change."
align="start"
/>
<ButtonGroup
primaryAction={<Button rightIcon={<ArrowRight />}>View all insights</Button>}
secondaryAction={<Button variant="outline">Subscribe</Button>}
/>
</div>
<Grid columns={3} gap="lg">
<ContentCard
alignment="vertical"
media={{
type: "image",
src: "/brand/editorial-1.jpg",
alt: "Consultants reviewing project notes at a table",
}}
title="Liquidity decisions need one operating rhythm"
excerpt="How leadership teams connect cash, margin, and working capital in the same cadence."
href="/insights/liquidity-rhythm"
/>
<ContentCard
alignment="vertical"
media={{
type: "image",
src: "/brand/editorial-2.jpg",
alt: "Printed materials arranged for a project review",
}}
title="Diligence that survives day one"
excerpt="What deal teams can carry from findings into action without losing momentum."
href="/insights/diligence-day-one"
/>
<ContentCard
alignment="vertical"
media={{
type: "image",
src: "/brand/ship.webp",
alt: "Container ship underway",
}}
title="Supply shocks are finance events"
excerpt="A practical view of translating disruption into inventory and cash decisions."
href="/insights/supply-shocks-finance"
/>
</Grid>
</div>When to use it
Use it for
- Major page sections where the heading and description should share one spacing system.
- CMS rich text descriptions that may render multiple paragraphs beneath a heading.
- Pairing with ButtonGroup (or TextTile, which does it for you) when a section lead needs actions. SectionTitle owns the text stack, not the buttons.
Reach for something else
- Compact dashboard card headings. Use Panel instead.
- Text inside interactive controls. Use Button, Tabs, or the owning control's typography instead.
- A standalone label or chip above unrelated content. Use Tagline instead.
- Fully locked CMS section templates. Use the TextAndText or TextAndMedia blocks instead.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
| variant | "default" | "largeText" | "default" | largeText drops the eyebrow and title and renders the description as one large statement. |
| tagline | TaglineProps | – | Eyebrow chip data: `{ text, variant }` rendered as the default Tagline. |
| eyebrowVariant | "tagline" | "breadcrumbs" | "tagline" | Swaps the eyebrow between the tagline chip and a breadcrumb trail (pass `breadcrumbs` crumbs). |
| title | ReactNode | – | The heading. |
| description | ReactNode | – | Body copy. A string renders one paragraph; rich/block content renders spaced paragraphs. |
| headingSize | "xl" | "lg" | "md" | "sm" | "lg" | Drives the title's heading variant and spacing. |
| headingTag | "h1"…"h6" | "p" | "div" | "label" | "span" | "h1" | Semantic tag for the title. Set per page hierarchy. |
| align | "start" | "center" | "end" | "stretch" | "center" | Cross-axis alignment of the stack. |