A section-level heading row with preamble, title, counter, description, and optional leading and trailing media.
4363:11467 in the 2026 Working File and renamed to Section Header. The 8-boolean matrix collapsed to TrailingMedia (4) × hasLeadingMedia (2) = 8 variants; property and layer naming follow the guidelines throughout, with text layers mapping onto §7 hierarchy as Preamble → Title → Description; and both media containers are now real Figma Slots. The nested Counter is the shared component as published, and the row is a static section label so interaction states are deliberately out of scope. All four DS Health traits pass; the only item still open is Code Connect, blocked until the native library exists.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
TrailingMedia (4) × hasLeadingMedia (2) gives 8 variants with no invalid combinations — every one is a shape a real section actually takes.TrailingMedia is PascalCase per §1, hasLeadingMedia uses True | False per §5, and the text layers map onto §7 hierarchy — Preamble → Title → Description.Image-Slot and the trailing icon an Icon-Slot, both real Figma Slots; Trailing Media is an instance in every variant that has one; and the count comes from the shared Counter component rather than being drawn in place.| 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. |
- Code Connect mappings not registered. Blocked — no native library exists yet. The schema is clean and ready: one enum, one boolean, three text layers and two slots. C7 · Code Connect Linkability
- Renamed to Section Header. v2.0: Rebuilt on node
4363:11467in the 2026 Working File and renamed fromHeaderto Section Header, describing what it actually is — a section-level heading row, not a screen chrome bar. Frees the Header prefix that four structurally different components were sharing. (C1 · Rename) C1 · Layer Structure & Naming - Eight boolean props collapsed to two. v2.0: The 8-boolean matrix with 256 theoretical combinations and 16 built variants is now
TrailingMedia(4) ×hasLeadingMedia(2) = 8 variants. Fewer than the three props recommended, and every combination is meaningful. (C2 · Property) C2 · Variant & Property Naming - Property naming corrected. v2.1:
hasTrailingMedia→TrailingMedia— a four-value enum should not carry a booleanhasprefix (§2) — andhasLeadingMediavalues wentYes | No→True | False, which §5 lists explicitly under DON'T. Thehasprefix is correct on that one because it is a genuine boolean. (C2 · Rename) C2 · Variant & Property Naming - Layer naming completed. v2.1–v2.2: Two frames both named
containerbecameLeadingMediaandHeaderContent;#title→Preamble,#heading→Title,#description→Description,header-description→DescriptionRow,header-counter→CounterSlot. The component-name prefixes are gone per §6, and the text layers now map exactly onto §7 content hierarchy:Preamble → Title → Description. Verified across all eight variants by full text scan. (C1) C1 · Layer Structure & Naming - Media containers converted to real Figma Slots. v2.2: Leading media went from a
Placeholderinstance to anImage-SlotSLOTin all fourhasLeadingMedia=Truevariants, and the trailing icon is now anIcon-SlotSLOTinside theTrailing Mediainstance. Teams can drop in real content without detaching. (C6 · Slot) C6 · Asset & Icon Quality - Trailing media made consistent across variants. v2.2:
Trailing Mediais an INSTANCE in every variant that has one — the Icon variants previously used a plain FRAME — and the stray instance inTrailingMedia=None, hasLeadingMedia=Trueis gone, so both None variants now match. (C1) C1 · Layer Structure & Naming - Nested
Counterconfirmed correct. v2.2: Closed by owner decision — theCounterinstance points at the Counter component as published, and stays. The rebuilt copy at4675:21497is a working-file version rather than a replacement, so no swap is needed. Worth revisiting only if the two ever diverge in the published library. (C4 · Composition) C4 · Native Mappability - Interaction states ruled out of scope. v2.2: Closed by owner decision — Section Header is not tappable. It is a static section label, so
Default | Pressed | Disabledwould describe interactions the component never has. Any tap target lives in the trailing media, and its states belong to that component. (C5) C5 · Interaction State Coverage - Header-family restructure closed. v2.3: Closed for this component. The restructure that mattered here is done — the base component is Section Header, which frees the Header prefix that four structurally different components were sharing, and its own naming, properties and layers all follow the guidelines. Header - With Logo has since been renamed Brand App Bar in Figma, confirming it stays a distinct component rather than merging into Title Bar. What remains is bookkeeping on two other pages rather than work on this one: the site still lists Brand App Bar under its old name, and Detail Hero still needs a call on whether it belongs in the family at all. Both are tracked on their own component pages. (Family) C1 · Layer Structure & Naming
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