Ivy-Apps /
android-guidebook
An opinionated collection of learnings from my Android experience as a founding engineer in 4 startups and a contractor at Toptal and Reddit.
81/100 healthLoading repository data…
ArcaDone / repository
A collection of "copy, paste, use" snippets and useful elements for those who intend to or are already developing an app in Compose Multiplatform or simply an Android app and already use Jetpack Compose and Material3.
A transparent discovery signal based on current public GitHub metadata.
This score does not audit code, security, maintainers, documentation quality, or suitability. Verify the repository and its current documentation before adoption.
A collection of "copy, paste, use" snippets and useful elements for those who intend to or are already developing an app in Compose Multiplatform or simply an Android app and already use * Jetpack Compose* and Material3.
A line chart with smooth curves, gradient fill, glow effects, and trend indicator badge.
ProgressionChartGlow(
data = listOf(
ChartDataPoint(100f, "Nov 1"),
ChartDataPoint(90f, "Nov 15"),
ChartDataPoint(100f, "Dec 1"),
ChartDataPoint(103f, "Dec 15"),
ChartDataPoint(105f, "Today"),
),
title = "Bench Press 1RM",
value = "105 kg",
trend = "+5%",
trendDirection = TrendDirection.UP,
style = ProgressionChartStyle(
lineColor = ProgressionGlowColors.LineGreen
)
)
// See FullAnalyticsPreview()
ProgressionChartGlow(
data = analyticsData,
style = ProgressionChartStyle(lineColor = ProgressionGlowColors.LinePurple, chartHeight = 220.dp, glowAlpha = 0.5f, lineWidth = 4.dp),
initialSelectionRange = 0.45f..0.82f,
animate = false,
onRangeSelection = { currentRange = it },
)
Key Parameters:
| Parameter | Description |
|---|---|
data | List of ChartDataPoint(value, label) |
title | Chart title (e.g., exercise name) |
value | Main value display |
trend | Trend percentage (e.g., "+5%") |
trendDirection | TrendDirection.UP, DOWN, or NEUTRAL |
style | Customize line color, glow, grid, gradients |
Features:
A full-screen 3D carousel with auto-scroll, gradient background, and a highlighted title. Cards animate with translation, scale, rotation, and blur for a depth effect.
FeatureCarousel(
title = "Create your next Outfit",
highlightedWord = "Outfit",
subtitle = "Discover the latest trends",
images = listOf(
CarouselImage(
url = "https://images.unsplash.com/photo-1504051771394-dd2e66b2e08f?w=900",
description = "Image 1",
),
CarouselImage(
url = "https://images.unsplash.com/photo-1526510747491-58f928ec870f?w=900",
description = "Image 2",
),
),
fractionHeight = 3,
)
Selected from shared topics, language and repository description—not editorial ratings.
Ivy-Apps /
An opinionated collection of learnings from my Android experience as a founding engineer in 4 startups and a contractor at Toptal and Reddit.
81/100 healthcomposablehorizons /
Composables UI is a collection of modern, fully accessible components for Jetpack Compose and Compose Multiplatform.
76/100 healthKey Parameters:
| Parameter | Description |
|---|---|
title | Full title text. If empty, the header is not rendered |
highlightedWord | Word within title rendered with a blue-violet gradient |
subtitle | Subtitle shown below the title. If empty, not rendered |
images | List of CarouselImage(url, description) to display |
fractionHeight | Divisor of screen height for component height (e.g. 3 = 1/3 screen). Default: 3 |
Features:
A photo grid with multi-selection support, long-press handling, and selection constraints. Perfect for image galleries with selection limits.
val photos = List(40) { ImageModel(image = "https://picsum.photos/id/${it}/600/600") }
val viewModel = remember { PhotoGridViewModel() }
LaunchedEffect(Unit) {
viewModel.setEvent(
PhotoGridEvents.OnStart(
lockedImage = null,
imageModelList = photos,
selectedImage = emptyList(),
selectionConstraints = SelectionConstraints(min = 1, max = 50),
)
)
}
PhotoGridMultiSelect(
imageModelList = photos,
selectedList = viewModel.uiState.value.selectedImage,
onImageLongClick = { imageModel, index ->
// Handle long press (e.g., show zoom modal)
},
onSelectionChange = { imageModel ->
viewModel.setEvent(PhotoGridEvents.OnPhotoTap(imageModel))
},
lockedImage = null, // Optional locked image that can't be deselected
)
Key Parameters:
| Parameter | Description |
|---|---|
imageModelList | List of ImageModel(image: String) to display |
selectedList | List of currently selected images |
onImageLongClick | Callback for long press (image, index) |
onSelectionChange | Callback when selection changes |
lockedImage | Optional image that stays selected |
selectionConstraints | SelectionConstraints(min, max) for validation |
Features:
A dual-synchronized carousel component with a top full-size image pager and bottom thumbnail strip. Features smooth synchronization, multi-selection, and aspect-ratio-aware borders.
var carouselState by remember {
mutableStateOf(
DoubleCarouselState(
images = List(10) { "https://picsum.photos/id/${it * 10}/800/600" },
currentIndex = 0,
selectedIndices = emptySet()
)
)
}
DoubleCarousel(
state = carouselState,
onStateChange = { carouselState = it },
config = DoubleCarouselConfig(
bottomThumbnailSize = 80.dp,
selectedBorderColor = Color.Cyan,
selectedBorderWidth = 3.dp,
spacing = 8.dp,
)
)
Key Parameters:
| Parameter | Description |
|---|---|
state | DoubleCarouselState(images, currentIndex, selectedIndices) |
onStateChange | Callback when state changes (navigation or selection) |
config | Customize thumbnail size, colors, spacing |
DoubleCarouselState Methods:
state.toggleSelection(index) // Toggle image selection
state.updateCurrentIndex(index) // Navigate to image
state.isSelected(index) // Check if image is selected
Features:
Configuration Options:
| Config Property | Description | Default |
|---|---|---|
maxVisibleInBottom | Max thumbnails visible in bottom carousel | 5 |
bottomThumbnailSize | Square thumbnail size | 80.dp |
selectedBorderColor | Border color for selected images | Cyan |
selectedBorderWidth | Border width for selected images | 3.dp |
spacing | Space between bottom thumbnails | 8.dp |
A customizable card with deformable corners and a circular cutout for icons.
DeformableCornerItem(
modifier = Modifier.size(200.dp),
circleRadius = 24.dp,
cardColor = Color(0xFFE0E0E0),
circleColor = Color(0xFFFF5252),
topLeft = 32.dp,
bottomLeft = 32.dp,
bottomRight = 32.dp,
contentCircle = {
Icon(
imageVector = Icons.Default.LocalFireDepartment,
contentDescription = null,
tint = Color.White,
modifier = Modifier.align(Alignment.Center)
)
},
contentRectangle = {
Text("Your content here", modifier = Modifier.align(Alignment.Center))
}
)
Key Parameters:
| Parameter | Description |
|---|---|
circleRadius | Radius of the corner circle |
cardColor | Background color of the card |
topLeft, bottomLeft, bottomRight | Corner radius for each corner |
contentCircle | Composable content inside the circle |
contentRectangle | Composable content inside the card |
A circular countdown timer with animated progress arc, glow effect, and heartbeat animation.
TimerWatch(
timerState = TimerState(
timeRemaining = 45,
totalTime = 60,
isRest = false
),
isOvertime = false,
showHeartbeat = true,
style = CircularTimerDefaults.style()
)
Key Parameters:
| Parameter | Description |
|---|---|
timerState | Contains timeRemaining, totalTime, isRest |
isOvertime | Shows red overtime state when true |
showHeartbeat | Enables pulsing animation under 5 seconds |
style | Customize colors, sizes, typography |
States:
A weekly bar chart with striped inactive bars and solid active bar.
val weekData = listOf(
BarData(label = "Mon", progress = 0.7f),
BarData(label = "Tue", progress = 0.4f),
BarData(label = "Wed", progress = 0.6f),
BarData(label = "Thu", progress = 0f),
BarData(label = "Fri", progress = 0.5f),
BarData(label = "Sat", progress = 1.0f),
BarData(label = "Sun", progress = 0.65f),
)
BasicBarChart(
chartData = weekData,
selectedIndex = 2,
activeBarColor = Color(0xFFF48C46),
onBarClick = { index -> /* handle click */ }
)
Key Parameters:
| Parameter | Description |
|---|---|
chartData | List of BarData(label, progress) |
selectedIndex | Index of highlighted bar (-1 for none) |
activeBarColor | Color of the selected bar |
onBarClick | Callback when a bar is clicked |
A segmented progress tracker with animated fill, glow effects, and completion checkmark.
TrackerContainer(
fillPercentage = 0.5f, // 0.0 to 1.0
isCompleted = false,
isActive = true,
isGlobalComplete = false,
waveDelayMillis = 0,
rangeStart = 0,
rangeEnd = 100,
style = GlowingTrackerDefaults.style()
)
Key Parameters:
| Parameter | Description |
|---|---|
fillPercentage | Progress from 0.0 to 1.0 |
isCompleted | Shows checkmark when true |
isActive | Highlights the segment |
isGlobalComplete | Triggers wave animation |
style | Customize colors, block size, animations |
MuscleGroupDonutVariant(
segments = listOf(
DonutSegment("Chest", 5000f, 0
ngapp-dev /
Quottie: Quote of the Day is your ultimate source for daily inspiration! 🌟 Dive into a curated collection of uplifting quotes that motivate and encourage you every day. Whether you’re looking for wisdom from famous authors or a quick boost of positivity, Quottie has you covered.
54/100 healthtkuenneth /
A collection of Compose Multiplatform examples
16/100 health