A single row in a list: leading asset + body text. 3 variants by level (1, 2, 3) that control indent (0 / 16 / 32 px). Composes a List Item Asset instance for the leading marker.
Adopt Figma Slots for the asset
The leading asset is today an instance-swap placeholder. Declare a named
asset Slot so consumers can drop in any List Item Asset variant (or a custom 16 × 16 component) directly. Maps 1 : 1 to @ViewBuilder / @Composable slots for Code Connect. Also rename level to an integer or drop it in favor of nesting-based indent.In Context
Contexts are illustrative. Final screens will reference actual GCash patterns. List Items compose into multi-line lists on terms pages, onboarding steps, and task checklists.
Live Preview
List body with level-1 style
Properties
level
asset
DS Health
Reusable
Pass
Used in terms, onboarding, checklists, step indicators. Handles 3 levels of nesting via indent.
Self-contained
Pass
Carries gap, indent, and typography bindings. Body text uses
Secondary/Bold/Base (BarkAda Semibold 14/20).Consistent
Warn
level uses string values ("1"/"2"/"3") instead of integers. Figma won't let you parameterize it either — each level is a separate variant. C2Composable
Warn
Leading asset uses instance-swap (default is a gray placeholder circle). Moving to a Figma Slot gives a cleaner composition surface and a direct slot mapping for Code Connect. C6
Open Issues
-
levelproperty uses string values. Should be an integer, or — ideally — dropped in favor of indent inferred from nesting depth inside the List container. C2 · Variant & Property Naming - Leading asset is an instance-swap placeholder. Adopt Figma Slots so the asset becomes a first-class slot mapping to
@ViewBuilder(SwiftUI) /@Composable(Compose) via Code Connect. C6 · Asset & Icon Quality - Code Connect mappings not registered. Blocked until
levelrename and the asset-slot adoption land. C7 · Code Connect Linkability
Design Recommendations
- Adopt a Figma Slot for the asset — declare a named
assetslot that accepts any List Item Asset instance (or a bare 16 × 16 component). Native maps to@ViewBuilder(SwiftUI) /@Composableslot (Compose) — Code Connect reads it as a real slot parameter. Slot - Rename or drop
level— if keeping the prop, change string values to integers. Better: drop the variant entirely and let indent come from nesting depth inside the List container. Rename - Consider a Trailing slot — product patterns often pair list items with trailing counters, badges, or chevrons. Adding a
trailingslot future-proofs the component without creating variant explosion. Slot
Styles
Level 1 — no indent
DES DEV
Base row. Asset + 270px body. No indent.
Properties
Level
Asset
Properties
Level 1
Asset bullet
Layout icon-leading + label-right
Colors
Icon #90A8D0
Description #445C85
Surface #FFFFFF
Layout
Row height 48 / 56px
Indent 0px
Padding H 16px
Padding V 12px
Icon size 24 × 24
Typography
Description style Secondary/Bold/Base
Description font BarkAda Semibold · 14 / 20
Colors by State
| Role | Token | Value |
|---|---|---|
| Body text | main/list-item/color/default/description | #445C85 |
Level 2 — 16px indent
DES DEV
Indented 16px. Body fills remaining width of the 294px container.
Properties
Level
Asset
Properties
Level 2
Asset bullet
Layout icon-leading + label-right
Colors
Icon #90A8D0
Description #445C85
Surface #FFFFFF
Layout
Row height 48 / 56px
Indent 0px
Padding H 16px
Padding V 12px
Icon size 24 × 24
Typography
Description style Secondary/Bold/Base
Description font BarkAda Semibold · 14 / 20
Layout
| Role | Token | Value |
|---|---|---|
| Asset → body gap | space/space-8 | 8px |
| Level 2 indent | space/space-16 | 16px |
| Level 3 indent | space/space-32 | 32px |
| Level 1 body width | — | 270px |
| Levels 2 + 3 container width | — | 294px |
| Body alignment | — | items-start (asset top-aligned) |
Level 3 — 32px indent
DES DEV
Indented 32px. Deepest supported level.
Properties
Level
Asset
Properties
Level 3
Asset bullet
Layout icon-leading + label-right
Colors
Icon #90A8D0
Description #445C85
Surface #FFFFFF
Layout
Row height 48 / 56px
Indent 0px
Padding H 16px
Padding V 12px
Icon size 24 × 24
Typography
Description style Secondary/Bold/Base
Description font BarkAda Semibold · 14 / 20
Typography
| Role | Token | Spec |
|---|---|---|
| Body | Secondary/Bold/Base | BarkAda Semibold · 14 / 20 |
Installation
Planned API
iOS — Swift Package Manager
// In Xcode: File → Add Package Dependencies "https://github.com/AY-Org/eb-ds-ios"
Android — Gradle (Kotlin DSL)
dependencies { implementation("com.eastblue.ds:list:1.0.0") }
Property Mapping
| Figma Property | SwiftUI | Compose |
|---|---|---|
| asset (Slot) | @ViewBuilder leading | leading: @Composable () -> Unit |
| level=1/2/3 | level: Int | level: Int |
| text content | content: String | content: String |
SwiftUI
ios/Components/List/EBListItem.swift
Jetpack Compose
android/components/list/EBListItem.kt
Usage Snippets Planned API
Usage
// Default bullet EBListItem("Transactions are reviewed within 24 hours.") { EBListMarker(variant: .bullet) } // Ordered with number EBListItem("Enter your GCash PIN to continue.") { EBListMarker(variant: .numbered, number: 1) } .level(2) // Custom asset via slot EBListItem("Saved to Favorites") { Image(systemName: "heart.fill") .foregroundStyle(.red) }
// Default bullet EBListItem(content = "Transactions are reviewed within 24 hours.") { EBListMarker(variant = EBListMarker.Bullet) } // Ordered with number, level 2 EBListItem( content = "Enter your GCash PIN to continue.", level = 2 ) { EBListMarker(variant = EBListMarker.Numbered, number = 1) } // Custom asset via slot EBListItem(content = "Saved to Favorites") { Icon(painterResource(R.drawable.heart), contentDescription = null, tint = Color.Red) }
Accessibility
| Requirement | iOS | Android |
|---|---|---|
| List container role | Wrap List Items in a List for VoiceOver row semantics | Use Modifier.semantics { collectionInfo = ... } on parent |
| Marker semantics | Decorative markers: .accessibilityHidden(true) on the asset | Same — contentDescription = null |
| Numbered lists | Prepend number to the announced label, or use .accessibilityValue | Include number in contentDescription |
Criteria Scorecard
| ID | Criterion | Status | Notes |
|---|---|---|---|
| C1 | Layer Structure & Naming | Ready | Simple row: asset + body text. |
| C2 | Variant & Property Naming | Needs Refinement | level uses string values; consider dropping the prop entirely. |
| C3 | Token Coverage | Ready | Body color, indent, gap tokens all bound. |
| C4 | Native Mappability | Ready | HStack / Row with slot. |
| C5 | Interaction State Coverage | Ready | Display-only; interaction lives on the consumer. |
| C6 | Asset & Icon Quality | Needs Refinement | Instance-swap works; Figma Slot would be cleaner and map to native slot params. |
| C7 | Code Connect Linkability | Needs Refinement | Not mapped. Slot adoption improves mapping quality. |
Variants Inventory (3 total)
| level | Indent | Width | Node ID |
|---|---|---|---|
| 1 | 0 | hug (body 270px) | 18482:34430 |
| 2 | 16px | 294px | 18482:34433 |
| 3 | 32px | 294px | 18482:34436 |
1.0.0 — April 2026Major
Initial Assessment · node 18482:34429
Component assessed — 3 variants (level 1/2/3). Composes List Item Asset via instance swap. Documented
Initiallevel uses string values — Should be integer or dropped in favor of nesting-based indent. OpenAsset is instance-swap — Adopt Figma Slots for first-class slot mapping. Open
C6 OpenCode Connect mappings — Not registered. Open
C7 Open