Blocks

Integration Connect

An OAuth-style connect sheet with paired logos, a permission checklist and documentation and source links.

Uv0

Connect Untitled to v0

Generate stunning UIs with AI, then customize and deploy instantly, straight from prompt to prod.

Untitled would like to

Generate UI components based on prompts
Sync generated layouts into your project
Preview and insert components in real time
Access and edit your existing v0.dev projects
Deploy updates directly to your frontend
untitledui.com/integrations/v0

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
@Composable
fun IntegrationConnectScreen(
    appName: String,
    target: String,
    permissions: List<String>,
    onClose: () -> Unit,
) {
    val emerald = Color(0xFF10B981)
    Column(
        Modifier.fillMaxSize().background(MaterialTheme.colorScheme.background).padding(20.dp),
    ) {
        Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween,
            verticalAlignment = Alignment.CenterVertically) {
            Row(verticalAlignment = Alignment.CenterVertically) {
                Surface(color = MaterialTheme.colorScheme.onBackground,
                    shape = RoundedCornerShape(10.dp), modifier = Modifier.size(36.dp)) {}
                Icon(Icons.AutoMirrored.Filled.ArrowForward, null,
                    Modifier.padding(horizontal = 8.dp).size(16.dp))
                Surface(color = MaterialTheme.colorScheme.onBackground,
                    shape = RoundedCornerShape(10.dp), modifier = Modifier.size(36.dp)) {}
            }
            IconButton(onClick = onClose) { Icon(Icons.Filled.Close, "Close") }
        }
        Text("Connect $appName to $target", Modifier.padding(top = 16.dp),
            style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.Bold)
        Text("Generate stunning UIs with AI, then customize and deploy instantly.",
            Modifier.padding(top = 4.dp), style = MaterialTheme.typography.bodySmall,
            color = MaterialTheme.colorScheme.onSurfaceVariant)
        HorizontalDivider(Modifier.padding(vertical = 16.dp))
        Text("$appName would like to", style = MaterialTheme.typography.labelMedium,
            fontWeight = FontWeight.SemiBold)
        permissions.forEach { p ->
            Row(Modifier.fillMaxWidth().padding(top = 12.dp),
                horizontalArrangement = Arrangement.SpaceBetween,
                verticalAlignment = Alignment.CenterVertically) {
                Row(verticalAlignment = Alignment.CenterVertically) {
                    Icon(Icons.Filled.Check, null, Modifier.size(16.dp), tint = emerald)
                    Spacer(Modifier.width(8.dp))
                    Text(p, style = MaterialTheme.typography.bodySmall)
                }
                Icon(Icons.Filled.ChevronRight, null, Modifier.size(14.dp))
            }
        }
        Spacer(Modifier.height(20.dp))
        Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
            OutlinedButton(onClick = {}, modifier = Modifier.weight(1f)) {
                Icon(Icons.Outlined.MenuBook, null, Modifier.size(14.dp))
                Spacer(Modifier.width(6.dp)); Text("Documentation")
            }
            OutlinedButton(onClick = {}, modifier = Modifier.weight(1f)) {
                Icon(Icons.Filled.Code, null, Modifier.size(14.dp))
                Spacer(Modifier.width(6.dp)); Text("Source")
            }
        }
    }
}