Blocks🧑
Wallet James
A wallet home with a gradient greeting header, balance with growth, quick actions and a subscriptions list.
Hello, James!
Active your new card
Wallet(USD)
$8,502.00
+8.56 %Latest transaction
◆-$12
Sketch
Monthly payment
2024.02.03
♪-$10
Spotify
Monthly payment
2024.02.03
▶-$8
Youtube
Monthly payment
2024.02.03
Installation
caveui components are copy-paste Jetpack Compose built entirely on Material 3 — there's no caveui dependency to add. Make sure Material 3 is on your classpath (it ships with the Compose BOM), then copy the Usage snippet below into your project.
kotlin
// build.gradle.kts (module)
dependencies {
implementation(platform("androidx.compose:compose-bom:2025.06.00"))
implementation("androidx.compose.material3:material3")
}Usage
kotlin
data class Subscription(val name: String, val note: String, val date: String, val amount: String, val tint: Color)
@Composable
fun WalletHeaderScreen(balance: String, change: String, items: List<Subscription>) {
Column(Modifier.fillMaxSize().background(MaterialTheme.colorScheme.background)) {
Column(
Modifier.fillMaxWidth()
.background(Brush.linearGradient(listOf(Color(0xFF3B82F6), Color(0xFF7C3AED))))
.padding(20.dp),
) {
Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
Column {
Text("Hello, James!", color = Color.White,
style = MaterialTheme.typography.titleLarge, fontWeight = FontWeight.ExtraBold)
Text("Active your new card", color = Color.White.copy(alpha = 0.7f),
style = MaterialTheme.typography.labelSmall)
}
Surface(color = Color.White.copy(alpha = 0.2f), shape = RoundedCornerShape(14.dp),
modifier = Modifier.size(40.dp)) {}
}
Text("Wallet(USD)", Modifier.padding(top = 16.dp),
color = Color.White.copy(alpha = 0.8f), style = MaterialTheme.typography.bodySmall)
Row(verticalAlignment = Alignment.CenterVertically) {
Text(balance, color = Color.White, style = MaterialTheme.typography.headlineLarge,
fontWeight = FontWeight.ExtraBold)
Spacer(Modifier.width(8.dp))
Surface(color = Color.White.copy(alpha = 0.2f), shape = CircleShape) {
Text(change, Modifier.padding(horizontal = 8.dp, vertical = 2.dp),
color = Color.White, style = MaterialTheme.typography.labelSmall)
}
}
Row(Modifier.padding(top = 12.dp), horizontalArrangement = Arrangement.spacedBy(10.dp),
verticalAlignment = Alignment.CenterVertically) {
Button(onClick = {}, shape = CircleShape,
colors = ButtonDefaults.buttonColors(
containerColor = Color.White.copy(alpha = 0.15f))) {
Text("Add"); Spacer(Modifier.width(4.dp))
Icon(Icons.Filled.Add, null, Modifier.size(16.dp))
}
listOf(Icons.Filled.NorthEast, Icons.Filled.South, Icons.Outlined.AccountBalanceWallet)
.forEach { icon ->
Surface(color = Color.White.copy(alpha = 0.15f), shape = CircleShape,
modifier = Modifier.size(36.dp)) {
Box(contentAlignment = Alignment.Center) {
Icon(icon, null, tint = Color.White, modifier = Modifier.size(16.dp))
}
}
}
}
}
Text("Latest transaction", Modifier.padding(16.dp),
style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.Bold)
items.forEach { s ->
OutlinedCard(Modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 4.dp)) {
ListItem(
leadingContent = {
Surface(color = s.tint, shape = RoundedCornerShape(10.dp),
modifier = Modifier.size(36.dp)) {}
},
headlineContent = { Text(s.name, fontWeight = FontWeight.Bold) },
supportingContent = { Text("${s.note} ${s.date}") },
trailingContent = { Text(s.amount, fontWeight = FontWeight.Bold) },
)
}
}
}
}