Adapt is a Compose-based UI component library that provides you components from various commonly used design systems on different platforms like Material 3 (for Android & Web), Cupertino (for iOS & macOS), and WinUI 3 (for Windows).
Adapt provides a Flutter-like experience where you can mix-and-match UI components between platforms to achieve your desired UI/UX output(s) (e.g. using Cupertino components on Android devices and Material components on Apple devices).
Adapt offers the following 2 types of composables/components:
- Platform-specific - These look the same on all platforms (e.g.
WindowsButton
,CupertinoSpinner
) - Platform-agnostic - These look native-like on every platform (e.g.
AdaptButton
,AdaptCircularIndicator
).
Along with Platform-specific components that allow you to write common UI for all platforms, Adapt also provides you with Platform-agnostic components that display native-like components on the current platform you're running.
For example, the following common code:
@Composable
internal fun App() {
AdaptButton(
modifier = AdaptModifier(common = Modifier.fillMaxSize().wrapContentSize()),
onClick = {},
text = { AdaptText("Click me") }
)
}
would produce the following results on different platforms π
Android (Material) | iOS (Cupertino) | Windows (WinUI3) |
---|---|---|
Hence, you can mix and match Platform-specific and agnostic components according to your desired output(s) π
Add the following to your shared module's build.gradle.kts
:
implementation("io.github.shubhamsinghshubham777:adapt:0.0.1-SNAPSHOT") // Get the latest version from GitHub Releases/Tags
Add the following to your project level settings.gradle.kts
:
dependencyResolutionManagement {
repositories {
...
maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") // Add this
}
}
Replace Material
based components with Adapt
based components:
@Composable
fun MyApp() {
MaterialTheme {
Button(onClick = {}, content = { Text("Click me") })
}
}
@Composable
fun MyApp() {
AdaptTheme {
AdaptButton(onClick = {}, text = { Text("Click me") })
// You can also use platform-specific components like IOSButton, MacOSButton, or WindowsButton
}
}
The long term goal of this library is to recreate all components from major design systems like
Material
, Cupertino
, WinUI
, etc. to allow developers to seamlessly create multiplatform apps
that look, feel, and behave native-like.
Expected upcoming components are: Checkbox
, TextField
, and Date/Time Pickers
.
Expected platform support: WASM (JS)
Demo.mp4
This repository also contains a sample Compose Multiplatform app that showcases the components provided by this library. You can check out this repository and simply run the app, but before you do that, please make sure to:
- check your system with KDoctor
- install JDK 17 on your machine
- add
local.properties
file to the project root and set a path to Android SDK there - run
./gradlew podInstall
in the project root
To run the application on android device/emulator:
- open project in Android Studio and run imported android run configuration
To build the application bundle:
- run
./gradlew :sample:composeApp:assembleDebug
- find
.apk
file insample/composeApp/build/outputs/apk/debug/composeApp-debug.apk
Run the desktop application: ./gradlew :sample:composeApp:run
To run the application on iPhone device/simulator:
- Open
sample/iosApp/iosApp.xcworkspace
in Xcode and run standard configuration - Or use Kotlin Multiplatform Mobile plugin for Android Studio
Run the browser application: ./gradlew :sample:composeApp:jsBrowserDevelopmentRun