A list-item variant with a leading asset slot — image, icon, or avatar — alongside the label.
Flatten the variant matrix + adopt Figma Slots
Replace the entangled
type × indicator × state axes with a single semantic variant enum (check, check-positive, pending, pending-notice, bullet, hollow, square, numbered, custom). Replace the Custom placeholder circle with a Figma Slot so product teams can drop in any 16×16 asset without instance-swap.In Context
List Item Asset appears inside List Items — see the List Item preview for the composed layout.
Live Preview
Proposed API
variant
DS Health
Reusable
Pass
Covers task lists, ordered/unordered lists, and custom-marker lists. Used across onboarding flows, terms pages, and step indicators.
Self-contained
Pass
All colors, sizes, typography bound to tokens. 16 × 16 bounding box is fixed.
Consistent
Warn
Three properties (
type, indicator, state) that shouldn't multiply freely — most combinations are invalid. Creates phantom variants in Figma's variant picker. C2Composable
Warn
indicator=Custom exposes a gray circle icon-placeholder instead of a Figma Slot. Blocks product teams from dropping in custom 16 × 16 assets without local overrides. C6Open Issues
- Variant matrix is entangled.
type×indicator×state= 72 theoretical combinations but only ~10 are valid. Flatten into one semanticvariantenum to eliminate invalid combos. C2 · Variant & Property Naming - Numbered indicator hardcodes "1." No way to pass the ordinal — numbered lists of 5 items all show "1." in Figma. Expose a
numbertext property. C5 · Interaction State Coverage -
indicator=Customis a hardcoded gray circle. Should be a Figma Slot that accepts any 16×16 asset via instance swap. C6 · Asset & Icon Quality - Code Connect mappings not registered. Blocked until variant flatten and slot adoption land. C7 · Code Connect Linkability
Design Recommendations
- Flatten the variant matrix — replace
type+indicator+statewith a single semanticvariantenum:check/check-positive/pending/pending-notice/bullet/hollow/square/numbered/custom. ~9 real variants, no invalid combinations possible. Property - Adopt a Figma Slot for
variant=custom— declare a namedassetslot so product teams can drop in any 16 × 16 component instance without editing the master. Maps cleanly to a@ViewBuilderslot (SwiftUI) or@Composableslot (Compose) via Code Connect. Slot - Parameterize the numbered indicator — expose a
numbertext property so ordered lists can show the actual ordinal. In Figma this is a text override; in native it's anumber: Intparam. Property
Styles
All markers
DES DEV
Pick a marker variant to preview. The 9 marker types are: check · check-positive · pending · pending-notice · bullet · hollow · square · numbered · custom (slot).
Properties
marker
Properties
Variant All markers
Asset slot Image / Icon / Avatar
Colors
Icon #90A8D0
Description #445C85
Surface #FFFFFF
Layout
Row height 64px
Asset size 40 × 40
Padding H 16px
Gap (asset ↔ label) 12px
Typography
Description style Secondary/Bold/Base
Description font BarkAda Semibold · 14 / 20
Colors by Variant
| Role | Token | Token | Value |
|---|---|---|---|
| check | icon | main/list-item/color/default/icon-item | #90A8D0 |
| check-positive | icon | main/list-item/color/positive/icon-item | #27C990 |
| pending | icon | main/list-item/color/default/icon-item | #90A8D0 |
| pending-notice | icon | main/list-item/color/notice/icon-item | #CA970C |
| bullet / hollow / square | icon | main/list-item/color/default/icon-item | #90A8D0 |
| numbered (bg) | container bg | main/list-item/color/default/icon-bg | #EEF2F9 |
| numbered (label) | number text | main/list-item/color/default/icon-item | #90A8D0 |
| custom | — | (slot — inherits from provided asset) | — |
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 |
|---|---|---|
| type × indicator × state | variant (enum) | .ebVariant(.check) |
| — (hardcoded "1.") | number: Int? | number: Int? |
| indicator=Custom placeholder | Figma Slot → ViewBuilder / @Composable | @ViewBuilder asset |
SwiftUI
ios/Components/List/EBListMarker.swift
Jetpack Compose
android/components/list/EBListMarker.kt
Usage Snippets Planned API
Usage
// Standard variants EBListMarker(variant: .check) EBListMarker(variant: .checkPositive) EBListMarker(variant: .pendingNotice) // Numbered EBListMarker(variant: .numbered, number: 1) // Custom — Figma Slot maps to @ViewBuilder EBListMarker { Image(systemName: "star.fill") .foregroundStyle(.yellow) }
// Standard variants EBListMarker(variant = EBListMarker.Check) EBListMarker(variant = EBListMarker.CheckPositive) EBListMarker(variant = EBListMarker.PendingNotice) // Numbered EBListMarker(variant = EBListMarker.Numbered, number = 1) // Custom — Figma Slot maps to @Composable slot EBListMarker { Icon(painterResource(R.drawable.star), contentDescription = null) }
Criteria Scorecard
| ID | Criterion | Status | Notes |
|---|---|---|---|
| C1 | Layer Structure & Naming | Ready | Semantic: container, Pending, Checkmark, shape_full. |
| C2 | Variant & Property Naming | Requires Rework | Three entangled axes; most combinations invalid. Flatten to single variant enum. |
| C3 | Token Coverage | Ready | All colors, typography, spacing bound to tokens. |
| C4 | Native Mappability | Ready | Custom atom on both platforms — straightforward render switch. |
| C5 | Interaction State Coverage | Needs Refinement | Numbered hardcodes "1."; no per-item ordinal. Otherwise display-only. |
| C6 | Asset & Icon Quality | Requires Rework | Custom indicator is a gray circle; should be a Figma Slot. |
| C7 | Code Connect Linkability | Needs Refinement | Not mapped. Clean mapping lands after flatten + Slot adoption. |
Variants Inventory (10 total)
After flatten + Slot adoption, these 10 collapse to 9 semantic variants + 1 custom slot — 0 invalid combinations possible.
| type | indicator | state | Node ID |
|---|---|---|---|
| Placeholder | Placeholder | Default | 18482:34426 |
| Unordered | Pending | Default | 18482:34407 |
| Unordered | Pending | Notice | 18482:34409 |
| Unordered | Check | Default | 18482:34411 |
| Unordered | Check | Positive | 18482:34413 |
| Unordered | Bullet | Default | 18482:34415 |
| Unordered | Hollow | Default | 18482:34417 |
| Unordered | Square | Default | 18482:34419 |
| Ordered | Custom | Default | 18482:34423 |
| Ordered | Normal | Default | 18482:34421 |
1.0.0 — April 2026Major
Initial Assessment · node 18482:34406
Component assessed — 10 variants across entangled type × indicator × state. Recommended flatten + Figma Slot adoption. Documented
InitialVariant matrix entangled — 72 theoretical, ~10 valid. Flatten to one
C2 Openvariant enum. OpenNumbered indicator hardcodes "1." — Needs a
C5 Opennumber parameter. OpenCustom indicator is a placeholder — Should be a Figma Slot. Open
C6 OpenCode Connect mappings — Not registered. Open
C7 Open