Cards
Cardsanimated

Product Carousel Dots

Product card with a swipeable image carousel and animated page dots.

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 CarouselDotsCard() {
  val pager = rememberPagerState { 4 }
  Card(
    modifier = Modifier.width(240.dp),
    shape = RoundedCornerShape(18.dp)
  ) {
    Column {
      HorizontalPager(pager, Modifier.height(140.dp)) {
        Box(
          Modifier
            .fillMaxSize()
            .background(MaterialTheme.colorScheme.surfaceVariant)
        )
      }
      Row(
        Modifier.fillMaxWidth().padding(12.dp),
        horizontalArrangement = Arrangement.Center
      ) {
        repeat(4) { i ->
          val w by animateDpAsState(
            if (i == pager.currentPage) 18.dp else 6.dp, label = "w")
          Box(
            Modifier
              .padding(3.dp)
              .height(6.dp)
              .width(w)
              .clip(CircleShape)
              .background(
                if (i == pager.currentPage)
                  MaterialTheme.colorScheme.primary
                else MaterialTheme.colorScheme.outline
              )
          )
        }
      }
    }
  }
}