
Facilitates cross-platform app development with shared code for UI, leveraging Compose Multiplatform. Supports platform-specific customizations, including SwiftUI integration for iOS.
CMP Bottom Bar is a Compose Multiplatform library containing a shared bottom-bar model and several visual styles. It targets Android, iOS, desktop, and WebAssembly.
| Module | Purpose |
|---|---|
coreBottomBar |
Shared item models, listeners, indicator configuration, and helpers |
basicBottomBar |
Horizontal and vertical basic bottom bars |
tinyGlideBottomBar |
Animated bar with expandable sub-items |
aztopiaBottomBar |
Animated circular Aztopia style |
expandableBottomBar |
Expandable bottom-bar experiment |
gooeyBottomBar |
Gooey/blurred bottom-bar experiment |
composeApp |
Multiplatform demo application |
iosApp |
SwiftUI host for the iOS demo |
Style modules depend on coreBottomBar; the demo app brings the styles together.
The development API keeps immutable item configuration separate from composable state:
BottomBarItem contains only visuals shared by selectable items.BottomBarInteraction defines whether an item is enabled and whether selection should select, toggle, or remain unchanged.BottomBarClickListener<T> and BottomBarHoverListener<T> provide typed callbacks without unsafe casts or empty listener objects.This API is a breaking change intended for the next 0.5.x release line.
The Basic style exposes state explicitly and supports horizontal or vertical placement:
val state = rememberBasicBarState(initialSelectedIndex = 0)
BasicBottomBar(
items = items,
state = state,
config = BasicBarConfig(position = BasicBarPosition.HorizontalBottom),
) { item, index ->
// `index` is null for an optional start or end action.
}BasicBarState.select(null) clears selection. Item interaction modes are respected, including toggle and non-selecting actions. Empty item lists render safely.
The currently configured Maven Central artifacts are:
implementation("io.github.mejdi14:cmp-bottombar-core:0.4.3")
implementation("io.github.mejdi14:cmp-bottombar-basic:0.4.3")
implementation("io.github.mejdi14:cmp-bottombar-tinyGlide:0.4.3")
implementation("io.github.mejdi14:cmp-bottombar-aztopia:0.4.3")expandableBottomBar and gooeyBottomBar are included as local experimental modules and are not currently configured for publication.
The development toolchain currently uses:
Use JDK 17 or 21, then run:
./gradlew :composeApp:assembleDebug
./gradlew :composeApp:run
./gradlew :composeApp:wasmJsBrowserDevelopmentRunOn macOS, open iosApp/iosApp.xcodeproj to run the iOS demo.
Supported Apple targets are iOS ARM64 devices and Apple Silicon simulators. The obsolete Apple x86_64 target was removed because current Compose Multiplatform releases no longer publish it.
Compose Multiplatform 1.12 requires API 37 and the AGP 9 Android-KMP architecture. That upgrade is intentionally deferred until the Android application can be extracted from the shared multiplatform module.
Publishing is handled by .github/workflows/publish.yml. Maven Central credentials and the GPG private key must remain in GitHub Actions secrets; they must never be added to gradle.properties or committed files.
Licensed under the Apache License 2.0. See LICENSE.
CMP Bottom Bar is a Compose Multiplatform library containing a shared bottom-bar model and several visual styles. It targets Android, iOS, desktop, and WebAssembly.
| Module | Purpose |
|---|---|
coreBottomBar |
Shared item models, listeners, indicator configuration, and helpers |
basicBottomBar |
Horizontal and vertical basic bottom bars |
tinyGlideBottomBar |
Animated bar with expandable sub-items |
aztopiaBottomBar |
Animated circular Aztopia style |
expandableBottomBar |
Expandable bottom-bar experiment |
gooeyBottomBar |
Gooey/blurred bottom-bar experiment |
composeApp |
Multiplatform demo application |
iosApp |
SwiftUI host for the iOS demo |
Style modules depend on coreBottomBar; the demo app brings the styles together.
The development API keeps immutable item configuration separate from composable state:
BottomBarItem contains only visuals shared by selectable items.BottomBarInteraction defines whether an item is enabled and whether selection should select, toggle, or remain unchanged.BottomBarClickListener<T> and BottomBarHoverListener<T> provide typed callbacks without unsafe casts or empty listener objects.This API is a breaking change intended for the next 0.5.x release line.
The Basic style exposes state explicitly and supports horizontal or vertical placement:
val state = rememberBasicBarState(initialSelectedIndex = 0)
BasicBottomBar(
items = items,
state = state,
config = BasicBarConfig(position = BasicBarPosition.HorizontalBottom),
) { item, index ->
// `index` is null for an optional start or end action.
}BasicBarState.select(null) clears selection. Item interaction modes are respected, including toggle and non-selecting actions. Empty item lists render safely.
The currently configured Maven Central artifacts are:
implementation("io.github.mejdi14:cmp-bottombar-core:0.4.3")
implementation("io.github.mejdi14:cmp-bottombar-basic:0.4.3")
implementation("io.github.mejdi14:cmp-bottombar-tinyGlide:0.4.3")
implementation("io.github.mejdi14:cmp-bottombar-aztopia:0.4.3")expandableBottomBar and gooeyBottomBar are included as local experimental modules and are not currently configured for publication.
The development toolchain currently uses:
Use JDK 17 or 21, then run:
./gradlew :composeApp:assembleDebug
./gradlew :composeApp:run
./gradlew :composeApp:wasmJsBrowserDevelopmentRunOn macOS, open iosApp/iosApp.xcodeproj to run the iOS demo.
Supported Apple targets are iOS ARM64 devices and Apple Silicon simulators. The obsolete Apple x86_64 target was removed because current Compose Multiplatform releases no longer publish it.
Compose Multiplatform 1.12 requires API 37 and the AGP 9 Android-KMP architecture. That upgrade is intentionally deferred until the Android application can be extracted from the shared multiplatform module.
Publishing is handled by .github/workflows/publish.yml. Maven Central credentials and the GPG private key must remain in GitHub Actions secrets; they must never be added to gradle.properties or committed files.
Licensed under the Apache License 2.0. See LICENSE.