Jump to a component
Core · Navigation
SectionHeader
SectionHeader opens a shelf: a heading, the line that explains what is on it, and an optional See all link.
Live, from @anicanon/sakuga 2.0.0
Sakuga for iOS and Android is coming
iOS
Coming soon
SectionHeader for iOS is in the roughs. The tokens it will read are the ones on this page, the same on every platform.
Android
Coming soon
SectionHeader for Android is in the roughs. The tokens it will read are the ones on this page, the same on every platform.
- Use it for
- The heading that opens a shelf, with the line that says what is on it ("Shorts · videos under a minute") and an optional See all link.
- Not for
- A labelled group of rows in a Story panel, with its countPanelSection
- The top of a side panel in StoryPanelHeader
- The top of a production viewViewHeader
- The label over a single control in a formField
Guidelines
- Always write the subtitle. It tells a new viewer what the shelf holds: "Shorts · videos under a minute", "Places in the story".
size="lg"(title-2) on desktop,md(title-3) on phone.- Give the See all link an
ariaLabelwith its object ("See all EBA shorts"). size="xs"is a label over a strip or a group inside a panel ("The issue, spread by spread"): 12px, no subtitle, no link; children sit at the row's end, such as a key.iconandcounthead a group in a list (a faction and how many are in it). With noactionlink, children sit at the row's end (a button).size="sm"(17 px) heads a section inside a page.
import { SectionHeader } from '@anicanon/sakuga/ui';
export default function SectionHeaderExample() {
return (
<>
<SectionHeader
title="Shorts"
subtitle="Vertical videos under a minute from EBA · moments, trailers, behind the scenes"
action={{ label: 'See all', ariaLabel: 'See all EBA shorts' }}
/>
<SectionHeader
size="md"
title="Cast"
subtitle="23 characters in the story"
/>
<SectionHeader size="xs" title="The issue, spread by spread" />
</>
);
}PropsSectionHeaderProps
titlerequiredReactNodesubtitleReactNodeaction{ label: string; href?: string; ariaLabel?: string; onClick?: MouseEventHandler; }size'lg' | 'md' | 'sm' | 'xs'as'h2' | 'h3'idstringiconIconNamecountReactNodechildrenReactNodeclassNamestringAn IconName is any of the names Icon lists.
Each token reads a role, and the role lands on a value in each theme. Change the role and every component that reads it follows.
Colour
section-header-titleSectionHeader: heading.text-primaryneutral-925#0b0a10text-primaryneutral-0#ffffffsection-header-subtitleSectionHeader: the line that explains the shelf.text-mutedneutral-600#5c5b67text-mutedneutral-400#a3a3a7section-header-actionSectionHeader: the See all link.text-secondaryneutral-800#2e2d36text-secondaryneutral-200#dcdcdesec-xs-titleSectionHeader xs: the small label over a section.text-mutedneutral-600#5c5b67text-mutedneutral-400#a3a3a7Space and shape
section-header-gapgap-xlsection-header-sub-margin-topgap-xssection-header-min-height-xssection-header-icon-sizeicon-size-lgsection-header-title-meta-gapgap-lgType
section-header-title-font-familyfont-displaysection-header-title-font-weightweight-boldsection-header-title-font-size-lgtext-subtitle-sizesection-header-title-line-height-lgtext-subtitle-line-heightsection-header-title-font-size-mdtext-title-3-sizesection-header-title-line-height-mdtext-title-3-line-heightsection-header-sub-font-sizetext-caption-sizesection-header-sub-line-heighttext-caption-line-heightsection-header-sub-font-weighttext-caption-weightsection-header-sub-font-familyfont-sanssection-header-action-font-familyfont-sanssection-header-action-font-sizetext-label-sizesection-header-action-font-weighttext-label-weightsection-header-title-font-xstext-microsection-header-title-font-size-smtext-subtitle-sm-sizesection-header-title-line-height-smtext-subtitle-sm-line-heightsection-header-count-fonttext-microChecked automatically with axe-core 4.11.4 against WCAG 2.2 A and AA, on the live preview above, in light and dark, on 26 October 2026.
- Result
- No issues found, in light or in dark.
- By design
- The title is a heading (
as, default h2) with its count read inside it, then the subtitle as text, and Tab reaches the See all link, named byaction.ariaLabeloraction.label(an action with onlyonClickis a button, never a link to #); the icon is hidden. At size xs the title is plain text, not a heading. - Not tested
- The automated check doesn't test keyboard use, focus order or what a screen reader says. The lines above are the design system's own account of them.