A display-only scheduled-payment row — a date and total on the first line, then however many label/amount cells you drop into its slot. Default and disabled states.
Keep — rebuilt on slots, naming settled
Kept as its own component rather than folded into Table Row, because it carries more controls than a standard row entry. The rebuild answered everything else: the type enum with its sentence-shaped values ("2 amounts display") is gone, replaced by a ⤷ AmountRowSlot that takes however many Table Amount Cell instances you need. The raster peso is now a Peso Sign - Proxima vector instance sitting in a ⤷ CurrencySlot, used consistently on both the primary line and the detail cells — the old mix of a bitmap glyph and a literal "PHP" string is gone. Slot names match the Table Row convention, the details row is named the same way in both states, and the date now reads #month / #day / #year with its separators kept as plain layers. Code Connect stays unmapped because the native library doesn't exist yet.
In Context
Scheduled payments screen (auto-debit, installment plans, standing orders): a list of upcoming payment rows stamped with a date, the total debit amount, and — where relevant — a breakdown of principal / interest / fee components.
Live Preview
MM / DD / YYYY₱X,XXX.XX
Label
Label₱X,XXX.XX
Label₱X,XXX.XX
Properties
State
hasAmountRow
hasBorder
Content
#month
#day
#year
#amount
#label
⤷ CurrencySlot
Peso Sign
⤷ AmountRowSlot
Table Amount Cells
DS Health
Reusable
Pass
⤷ AmountRowSlot takes any number of detail cells rather than a fixed 0 / 2 / 4, and ⤷ CurrencySlot means a non-peso currency is a swap rather than a detach.
Self-contained
Pass
The currency prefix is one Peso Sign - Proxima vector instance used the same way on the primary line and inside each detail cell. The raster asset and the literal "PHP" string are both gone.
Consistent
Pass
Slot names match the Table Row convention (⤷ CurrencySlot, ⤷ AmountRowSlot), State is a PascalCase variant property, and both states name the details row identically. The date's three text properties are distinguishable from its separators.
Composable
Pass
Detail cells are Table Amount Cell instances placed in a slot, and each nests its own ⤷ CurrencySlot. The old inline re-implementation of the label / value pair is gone.
Behavior
State
iOS
Android
Figma Property
Notes
Default
Yes
Yes
State=Default
360 × 89. Date on the left at Proxima Soft Semibold 12, total in #005CE5 Bold 14, then a details row of label/amount cells.
Disabled
Yes
Yes
State=Disabled
Every text layer dims to #C2CFE5 — date, total, labels, and cell values alike.
Pressed
N/A
N/A
Not built
Not needed — the row is display-only and carries no tap target.
Issues
The peso glyph is still a boolean operation.Peso Sign - Proxima wraps a shape_full BOOLEAN_OPERATION rather than a flattened vector. It renders correctly and is a clear improvement on the old raster, but boolean operations are the pattern this review process routes to the Iconography team to flatten. Delegated — not this component's owner to fix. C6 · Asset & Icon Quality
Code Connect mappings not registered. Blocked — the native component library doesn't exist yet. Nothing to action on the design side. C7 · Code Connect Linkability
The type enum is gone. v2.0: rebuilt on node 5868:40468. The sentence-shaped values ("no display amount", "2 amounts display", "4 amounts display") are replaced by ⤷ AmountRowSlot, which holds however many Table Amount Cell instances the surface needs. C2 · Variant & Property Naming
The peso sign is a vector. v2.0: the raster image fill is replaced by a Peso Sign - Proxima component instance in a ⤷ CurrencySlot, on both the primary line and inside each detail cell. The literal "PHP" prefix on detail amounts is gone, so one treatment now covers the whole component. The custom glyph is deliberate — it matches Proxima and takes less width than spelling out PHP. C6 · Asset & Icon Quality
The row maps to native primitives. v2.0: frames and slots throughout, so it builds as a VStack / Column with a nested row of cells. No platform table primitive required. C4 · Native Mappability
Interaction states are intentionally minimal. v2.0: reviewed and settled. The row is display-only, so pressed is not needed. State=Disabled is built for past, cancelled, or skipped entries and dims every text layer to #C2CFE5. C5 · Interaction State Coverage
Both states name the details row the same way. v2.1: details-row in Default (5868:40492) and Disabled (5878:41670) alike. The stray item-row is gone. C1 · Layer Structure & Naming
The date's text properties are distinguishable. v2.1: the five identically-named #label layers are now #month, separator, #day, separator, #year. The three a developer sets are obvious from the layer tree, and the two restylable separators no longer read as text properties. C2 · Variant & Property Naming
Staying a separate component is intentional. v2.0: reviewed and dismissed. Scheduling carries more controls than a standard Table Row entry — a date line, a primary total, and a variable row of label/amount cells — so it keeps its own record rather than folding into Table Row or shipping as a recipe. It now shares Table Row's slot naming, so the two read as one family. C1 · Layer Structure & Naming
Recommendations
Align the value layer name with Table Row. The detail cell here uses #value, which reads correctly. Table Row's data cell uses #description for the same role. #value is the better name — worth aligning the two when Table Row is next touched. Rename
Flatten the peso glyph. For the Iconography team: Peso Sign - Proxima wraps a shape_full BOOLEAN_OPERATION. Flattening it to a plain vector removes a class of export and scaling surprises. Asset
Document scheduling semantics. Add guidance on which amount belongs on the primary line (the total debit) versus the detail cells (principal, interest, fee, tax). Without it the component gets reused as a generic multi-amount row on surfaces that aren't schedules. Docs
Audit the colour token bindings. The review tooling reads raw hex and can't see variable bindings, so C3 is recorded as unverified. Confirm #0A2757, #6780A9, #005CE5, and the #C2CFE5 disabled colour are all bound. Token
See siblings:Table Row — the standard row for column-aligned data. Scheduling stays separate because it carries a date line and a variable detail row on top of that; keep slot naming and state coverage aligned across both. Family
Rename type values to integers, or drop the property. v2.0: Applied — dropped entirely. Detail count comes from the number of cells in ⤷ AmountRowSlot. Rename
Unify the currency prefix treatment. v2.0: Applied — one Peso Sign - Proxima vector instance in a ⤷ CurrencySlot, on the primary line and in every detail cell. The raster and the "PHP" literal are both gone. Asset
Compose each detail cell rather than re-implementing it. v2.0: Applied — detail cells are Table Amount Cell instances placed through a slot, each nesting its own currency slot. Composition
Add row interaction states if Scheduling stays. v2.0: Applied as far as it goes — State=Disabled shipped. Pressed was reviewed and dropped: the row is display-only. State
Remove Table - Scheduling from core DS, or collapse the family. v2.0: Settled — neither. Scheduling stays its own component because it carries more controls than a standard row entry, and it now shares Table Row's slot conventions so the family reads as one. Family
Give the details row one name across both states. v2.1: Applied — details-row in Default and Disabled alike. Rename
Name the date's separator layers distinctly from its text properties. v2.1: Applied — #month, separator, #day, separator, #year. The three editable properties are now obvious from the layer tree. Rename
Types
Default
DESDEV
360 × 90 on white. A date and peso-prefixed total on the first line, then a details row of <code>Table Amount Cell</code> instances. Toggle <code>hasAmountRow</code> to drop the details row, or vary how many cells sit in the slot.
// Recommended — compose with Inline Text (phone-width)EBGenericTransactionCard {
EBInlineText(label = "MAY 10, 2026", value = "₱1,250.00",
style = EBAmountStyle.Primary)
Row {
EBInlineText(label = "Principal", value = "PHP 1,100.00")
EBInlineText(label = "Interest", value = "PHP 150.00")
}
}
// Option B — if Scheduling row is retainedEBTableSchedulingRow(
date = LocalDate.now(),
amount = 1250.00,
details = listOf(
SchedulingDetail("Principal", "PHP 1,100.00"),
SchedulingDetail("Interest", "PHP 150.00")
)
)
Accessibility
Requirement
iOS
Android
Row semantics
If tappable, wrap as Button with .accessibilityLabel("Scheduled payment, May 10 2026, 1,250 pesos") — combine the date and amount into one spoken phrase.
Wrap in Modifier.clickable + Modifier.semantics(mergeDescendants = true); set contentDescription to a full spoken phrase.
Currency glyph fallback
Use Unicode \u{20B1} inline — avoid a raster image that won't scale with Dynamic Type.
Use Unicode ₱ inline — avoid a bitmap that won't respect font-scale settings.
Date formatting
Use Date.FormatStyle with the user's locale; don't hardcode MMM DD, YYYY.
Use DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM); don't hardcode format string.
Detail label / value pairing
Group each detail cell so VoiceOver reads "Principal, 1,100 pesos" as one element, not two.
Group each detail cell so TalkBack reads "Principal, 1,100 pesos" as one element, not two.
Disabled / past rows
Past or cancelled schedules: .accessibilityHint("Past payment") + muted label tokens.
Past or cancelled schedules: Modifier.semantics { stateDescription = "Past payment" } + muted label tokens.
Criteria Scorecard
ID
Criterion
Status
Notes
C1
Layer Structure & Naming
Ready
Composes Table Amount Cell instances through ⤷ AmountRowSlot, with details-row named identically in both states.
C2
Variant & Property Naming
Ready
State is a PascalCase variant property. The type enum and its sentence-shaped values are gone.
C3
Token Coverage
Needs Refinement
Not verified — the read-only tooling can't see variable bindings. The literal "PHP" prefix is gone, so there is one currency treatment to bind rather than two.
C4
Native Mappability
Ready
Frames and slots throughout — builds as a VStack / Column with a nested row of cells.
C5
Interaction State Coverage
Ready
Display-only by design, so pressed is not needed. State=Disabled dims every text layer to #C2CFE5.
C6
Asset & Icon Quality
Needs Refinement
Raster replaced by a Peso Sign - Proxima vector instance in ⤷ CurrencySlot, used consistently. It still wraps a shape_full BOOLEAN_OPERATION — delegated to the Iconography team to flatten.
C7
Code Connect Linkability
Not Mapped
Blocked — the native component library doesn't exist yet.
Variants Inventory (2 total)
State (2) = 2 published versions. Two booleans sit on top without adding variants — hasAmountRow and hasBorder — so the real combination count is 8. Detail-cell count isn't a version either: the ⤷ AmountRowSlot takes however many Table Amount Cell instances you drop in, replacing the old type axis that hard-coded 0 / 2 / 4.
State
Dimensions
Background
Node
Default
360 × 90
#FFFFFF
5868:40481
Disabled
360 × 90
#FFFFFF
5878:41658
1.0.0 — April 2026Major
Initial Assessment · node 47:324365
Family assessed — 3 variants selected by a single type enum. Third parallel Table-family record (Table, Table - Transaction, Table - Scheduling). Documented
Initial
Third family schema divergence — Introduces a new type enum instead of reusing Table's type × no. of columns × icon or Transaction's schema. Recommend folding into Inline Text / Table data-driven row. Open
C1 Open
Sentence-fragment enum values — "no display amount" / "2 amounts display" / "4 amounts display" bake the detail count into natural-language strings. Open
C2 Open
No native mobile primitive — Scheduled payments are a List / LazyColumn pattern on mobile, not a fixed 360px grid. Open
C4 Open
No interaction / disabled states — Scheduling rows are typically tappable or visually muted for past / cancelled entries. Open
C5 Open
Mixed currency prefix treatments — Primary amount ships as a raster peso glyph; detail amounts use a literal "PHP" string. Open