Embed individual screens and sheets one at a time. Each element ships with props, an Appearance override, and a callback API. Mix any combination — your nav stack, our flows.
GroupsListEvery group the end-user belongs to. Search, swipe-to-archive, create-new. Tap a row to open GroupDetail — or hand the click off to your own router via onGroupSelected.
| Prop | Type | Effect |
|---|---|---|
showCreateButton | Boolean | Show / hide the floating "New group" CTA |
onGroupSelected | (groupId) → | Your handler. Return true to consume; false falls back to default navigation |
filter | GroupFilter | ALL / ACTIVE / ARCHIVED |
appearance | Appearance? | Override colors, radius, typography for this element only |
// Kotlin / Compose GroupsList( showCreateButton = true, onGroupSelected = { groupId -> myRouter.push("split/$groupId"); true }, )
AddExpenseSheetThe full add-expense flow as a single bottom sheet: amount, payer, currency, split mode (equal / shares / exact), receipt photo. Drop this into a chat thread, a checkout, or a "split this charge" button on a transaction row.
| Prop | Type | Effect |
|---|---|---|
groupId | String? | Pre-select the target group. If null, the user picks |
seedAmount | Money? | Pre-fill the amount + currency (e.g. from a transaction) |
seedParticipants | List<UserId>? | Pre-select who's in |
onSaved | (Expense) → | Fires after the expense is created. Use to dismiss your host UI |
onDismissed | () → | User cancelled |
// Pre-fill from a bank-feed transaction AddExpenseSheet( groupId = "grp_flat4b", seedAmount = Money("36.72", "USD"), onSaved = { dismissBottomSheet() }, )
ReceiptScanFlowCamera → OCR → per-item assignment → save. Three OCR tiers (Quick / Sharp / Pro) chosen per-scan or fallback chained. Camera permission is the host app's responsibility.
| Prop | Type | Effect |
|---|---|---|
defaultEngine | OcrEngine | QUICK (free, on-device) / SHARP / PRO |
fallbackChain | List<OcrEngine> | Auto-retry next tier on low-confidence |
onScanned | (ReceiptDraft) → | You get items + total before assignment |
onSaved | (Expense) → | Final saved expense |
ReceiptScanFlow( defaultEngine = OcrEngine.QUICK, fallbackChain = listOf(OcrEngine.SHARP), onSaved = { exp -> myFeed.prepend(exp) }, )
SettleSheetThe "who pays whom" UI with debt simplification, suggested amounts, and mark-paid actions. Hook it into your in-app payments by intercepting onSettlePressed with your own payment provider.
| Prop | Type | Effect |
|---|---|---|
groupId | String | Required |
simplify | Boolean | Run debt simplification (defaults true) |
onSettlePressed | (Settlement) → | Return HANDLED to skip our in-app mark-paid (you'll trigger payment yourself) |
BalancesCardA compact one-line widget: "Marco owes you $24.50 across 2 groups". Drop on a dashboard, a transaction footer, or a chat sidebar.
| Prop | Type | Effect |
|---|---|---|
scope | BalanceScope | ALL / GROUP(groupId) / USER(userId) |
compact | Boolean | Single-line vs multi-row layout |
onTapped | () → | Open your own destination (defaults to SettleSheet) |
Elements are the design contract — if you need a screen we haven't catalogued, the answer is probably "use the headless API and ship it." Tell us what you'd embed and we'll consider promoting it.
Request the SDK