The top-of-screen header pattern with title, leading back action, and trailing actions.
preamble, leadingMedia, trailing), and the sibling "Header - *" components either renamed by role or merged into existing primitives. See the Family Restructure section below for the full plan.Section headers sit above grouped content — a list of transactions, a set of services, a carousel of offers — to label the section and optionally expose a trailing action.
Heading
Description goes here
| State | iOS | Android | Figma Property | Notes |
|---|---|---|---|---|
| Default | Yes | Yes | 16 variants | The only state today — no pressed/disabled/focused. |
| Trailing action pressed | N/A | N/A | Not modeled | Link, edit, counter should be real Button/Link instances that carry their own pressed state. |
| Disabled | N/A | N/A | Not modeled | Section headers are informational — no disabled variant needed. |
| Focused (a11y) | N/A | N/A | — | Focus lives on the trailing action, not the header itself. |
- Family-wide naming conflict. "Header" prefix conflates 4 roles (section header, page banner, brand bar, detail hero). Rename each by role. C1 · Layer Structure & Naming
- 8 boolean props, 256 theoretical combos, 16 built. The boolean model implies combinations that don't exist. Collapse
icon+left illustrationintoleadingMedia, andright illustration+link+edit+counterintotrailing. C2 · Variant & Property Naming - Trailing actions aren't real components. Link ("View All"), Edit, and Counter are drawn in-place rather than accepting Button / Badge / Link instances. Breaks composition and blocks state handling (pressed, disabled). C4 · Native Mappability
- No pressed/disabled states on the actionable slots. Natively, those slots need full state coverage — at minimum pressed + disabled. C5 · Interaction State Coverage
- No Code Connect mappings. Trivial once slots are enumerated. C7 · Code Connect Linkability
- Rename to "Section Header". Unambiguously signals in-screen section title; frees "Header" namespace. Rename
- Collapse to 3 props —
preamble?,leadingMedia?: icon | illustration,trailing?: illustration | link | edit | counter— plus the requiredtitle. Eliminates invalid combos, drops variant count from 16 to ~6 canonical patterns. Property - Promote actionable slots to real components. "View All" becomes a Text Button instance. "Edit" becomes an Icon Button. "Counter" becomes a Badge instance. Each carries its own pressed/disabled states. Composition
- Move "Header - Transaction" out of the family. It's a card hero, not a header. Rename to Detail Hero and rehome near Visual Popup. Family
- Merge "Header - With Logo" into Title Bar. Add
leading = title | logoslot to Title Bar instead of maintaining a second app-bar component. Family - See siblings: Header - Centered, Header - With Logo, Header - Transaction. Restructure is a family-wide decision. Family
The simplest variant — a bare title. This is the baseline the other 15 variants layer slots onto.
Heading
Baseline header: just the heading on a white surface. Card stroke is invisible by default.
| Role | Token | Default |
|---|---|---|
| Surface bg | main/header/surface | #FFFFFF |
| Heading | text/primary/headline/section | #0A2757 |
All three text slots filled. This is the canonical "announce a section" pattern.
Preamble
Heading
Description goes here
Tier-three layout with eyebrow preamble, heading, and supporting description.
| Role | Token | Default |
|---|---|---|
| Surface bg | main/header/surface | #FFFFFF |
| Preamble | text/accent/eyebrow | #005CE5 |
| Heading | text/primary/headline/section | #0A2757 |
| Description | text/primary/body/secondary | #6780A9 |
Title on the left, "View All" link on the right. Common list-section pattern.
Heading
Heading followed by a trailing hyperlink (e.g. "See all").
| Role | Token | Default |
|---|---|---|
| Surface bg | main/header/surface | #FFFFFF |
| Heading | text/primary/headline/section | #0A2757 |
| Link label | text/accent/link | #005CE5 |
Title left, pencil icon + "Edit details" link right. Used on profile/settings sections.
Heading
Heading followed by an edit affordance (icon + hyperlink label).
| Role | Token | Default |
|---|---|---|
| Surface bg | main/header/surface | #FFFFFF |
| Heading | text/primary/headline/section | #0A2757 |
| Edit icon | icon/accent | #005CE5 |
| Edit label | text/accent/link | #005CE5 |
Title left, numeric counter pill right. Used on inbox/notifications.
Heading
Heading followed by a count chip (e.g. unread badge, item total).
| Role | Token | Default |
|---|---|---|
| Surface bg | main/header/surface | #FFFFFF |
| Heading | text/primary/headline/section | #0A2757 |
| Counter chip bg | main/counter/surface | #EEF2F9 |
| Counter value | text/primary/body/secondary | #6780A9 |
| Figma Property | SwiftUI | Compose |
|---|---|---|
preamble: boolean | preamble?: String | preamble: String? |
| (implicit) | title: String | title: String (required) |
description: boolean | description?: String | description: String? |
icon + left illustration | leadingMedia?: icon | illustration | leadingMedia: EBLeadingMedia? |
right illustration + link + edit + counter | trailing?: illustration | link | edit | counter | trailing: EBHeaderTrailing? |
| Requirement | iOS | Android |
|---|---|---|
| Heading trait | Apply .accessibilityAddTraits(.isHeader) to the title. | Apply Modifier.semantics { heading() } to the title text. |
| Trailing action label | Link/Edit/Counter must each carry their own accessibility label. Counter should announce count ("12 unread"). | Same — each trailing slot owns its own semantics. |
| Minimum touch target | Trailing interactive element must be ≥44×44pt. | Trailing interactive element must be ≥48×48dp. |
| Reading order | Preamble → Title → Description → Trailing. VoiceOver follows DOM order. | Same reading order — TalkBack follows composition order. |
| ID | Criterion | Status | Notes |
|---|---|---|---|
| C1 | Layer Structure & Naming | Requires Rework | "Header" prefix shared with 3 structurally different components. Rename to Section Header. |
| C2 | Variant & Property Naming | Requires Rework | 8 booleans → 3 props (preamble, leadingMedia, trailing). Drops 16 variants to ~6 canonical patterns. |
| C3 | Token Coverage | Ready | Typography and color bound to DS tokens. |
| C4 | Native Mappability | Needs Refinement | Maps to a simple EBSectionHeader view/composable once slots collapse. Trailing actions should be real Button/Badge instances, not drawn. |
| C5 | Interaction State Coverage | Needs Refinement | Header itself is static; trailing actions inherit Button/Link state coverage once they become instances. |
| C6 | Asset & Icon Quality | Needs Refinement | Confirm leading/trailing "illustration" slots accept vector instances (Avatar / Icon / custom). Placeholder circle suggests unverified. |
| C7 | Code Connect Linkability | Not Mapped | Cannot map until property model collapses and trailing slots resolve to real components. |
Today: 8 independent boolean properties — preamble, description, icon, left illustration, right illustration, link, edit, counter. 2⁸ = 256 theoretical combos, only 16 built — most combinations are either invalid or unsupported.
| Group | Count | Slots enabled |
|---|---|---|
| Text-only | 4 | preamble × description permutations |
| With right icon (top-aligned) | 4 | preamble × description × icon |
| With leading illustration | 2 | description × left illustration |
| With trailing illustration | 2 | description × right illustration |
| With link (View All) | 2 | description × link |
| With edit | 1 | edit only |
| With counter | 1 | counter only |
preamble, leadingMedia, trailing). Open