KeepNeeds Refinement
Table Scheduling Component link

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.

Payment Schedule MAY 10, 2026 ₱1,250.00 Principal PHP 1,100 Interest PHP 150 JUN 10, 2026 ₱1,250.00 Principal PHP 1,110 Interest PHP 140 JUL 10, 2026 ₱1,250.00 Manage Schedule
Live Preview
MM / DD / YYYYX,XXX.XX
Label
LabelX,XXX.XX
LabelX,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
DES DEV

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.

Properties
State
hasAmountRow
Table Amount Cells
Properties
State Default
hasAmountRow true
Table Amount Cells 2
Colors
Surface bg #FFFFFF
Date label #0A2757
Primary amount #005CE5
Currency glyph #005CE5
Detail label #6780A9
Detail value #0A2757
Layout
Height 132.5
Padding H 24
Padding V 16
Date column width 108
Detail leading width 111
Typography
Date label Proxima Soft Semibold · 12 / 12 · +0.5
Primary amount Proxima Soft Bold · 14 / 14 · +0.25
Detail label Proxima Soft Semibold · 12 / 14 · +0.5
Detail value Proxima Soft Semibold · 12 / 12 · +0.5
Colors by State
Role Token DefaultPressedDisabled
Row bg main/table/color/bg #FFFFFF
Date label main/table/color/label #0A2757
Primary amount main/table/color/label-amount #005CE5
Currency glyph (peso, primary) main/table/color/icon-currency-primary #005CE5
Detail preamble label main/table/color/label-preamble #6780A9
Detail value main/table/color/label #0A2757
Property Mapping
Figma PropertySwiftUICompose
State = Default | Disabled .disabled(true) enabled = false
hasAmountRow: Boolean details: [AmountCell] — empty hides the row details: List<AmountCell> = emptyList()
hasBorder: Boolean showsDivider: Bool = true showsDivider: Boolean = true
#month · #day · #year date: DateComponents date: LocalDate
#amount (primary total) total: String total: String
#label (details row) label: String label: String
⤷ CurrencySlot currency: AnyView currency: @Composable () -> Unit
⤷ AmountRowSlot (N × Table Amount Cell) details: [AmountCell] details: List<AmountCell>
Table Amount Cell → #label / #value AmountCell(label:, value:) AmountCell(label =, value =)
SwiftUI
ios/Components/Table/EBTableSchedulingRow.swift
Jetpack Compose
android/components/table/EBTableSchedulingRow.kt
Usage Snippets Planned API
Usage
// Recommended — compose with Inline Text (phone-width)
EBGenericTransactionCard {
    EBInlineText(label: "MAY 10, 2026", value: "₱1,250.00")
        .ebAmountStyle(.primary)
    HStack {
        EBInlineText(label: "Principal", value: "PHP 1,100.00")
        EBInlineText(label: "Interest",  value: "PHP 150.00")
    }
}

// Option B — if Scheduling row is retained
EBTableSchedulingRow(
    date: Date(),
    amount: 1250.00,
    details: [
        .init("Principal", "PHP 1,100.00"),
        .init("Interest",  "PHP 150.00")
    ]
)
// 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 retained
EBTableSchedulingRow(
    date = LocalDate.now(),
    amount = 1250.00,
    details = listOf(
        SchedulingDetail("Principal", "PHP 1,100.00"),
        SchedulingDetail("Interest",  "PHP 150.00")
    )
)
Accessibility
RequirementiOSAndroid
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.

StateDimensionsBackgroundNode
Default360 × 90#FFFFFF5868:40481
Disabled360 × 90#FFFFFF5878: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
C6 Open
Code Connect mappings — Not registered. Open
C7 Open