Unified Compose Multiplatform wrappers of common and Material Design APIs for rendering-based Compose UI (officially supported on Android, desktop (JVM), iOS, and web (Kotlin/Wasm)) and DOM-based Compose HTML
This library was previously named "Compose Multiplatform Material".
We try to provide a set of common APIs including composable component APIs akin to those in androidx.compose
(androidx.compose.foundation
, androidx.compose.material
, and androidx.compose.material3
), meanwhile making them compatible with the Compose HTML APIs. However, only subsets of the composables and composable parameters are supported due to the underlying API differences, limitations of the JS platform and the available Compose HTML composables this project depends on, and our limited effort.
The modules of this library correspond to the Compose Multiplatform modules (or Compose modules in AndroidX) that are not available for Compose HTML, aka those that depend on the UI module, more specifically ui-graphics
. The common
module of this library corresponds to the ui
and foundation
modules, offering UI components (including layouts), modifiers, UI configuration classes, etc.
The Compose HTML / JS DOM source is mainly based on Kobweb Silk Compose, KMDC, and Compose HTML Material (which is then based on Material Web).
Complete visual consistency across different platforms is not guaranteed. See the side-by-side demo site for the visual effects and their differences.
This project is still in development and has not reached a stable state. Some APIs are subject to change and there is no detailed documentation yet. Check out the demo project source on how to use the components in addition to the sections below.
BasicText
TaglessBasicText
Box
(based on Kobweb)Column
(via flexbox on JS, based on Kobweb)Row
(via flexbox on JS, based on Kobweb)Spacer
BoxWithConstraints
LazyColumn
(via flexbox on JS, based on Kobweb)LazyRow
(via flexbox on JS, based on Kobweb)
Button
Card
Checkbox
Divider
(not working properly on JS yet)Icon
IconButton
Snackbar
(inconsistent, not recommended),SnackBarHost
(recommended)Switch
Text
Button
IconButton
RadioRow
,RadioGroupRow
SwitchWithLabel
MaterialText
,TaglessText
TextField
,OutlinedTextField
TopAppBarScaffold
List
/LazyColumnList
(visually inconsistent for now)
Button
(FilledButton
),ElevatedButton
,FilledTonalButton
,OutlinedButton
,TextButton
Card
(FilledCard
),ElevatedCard
,OutlinedCard
Checkbox
FloatingActionButton
,SmallFloatingActionButton
,LargeFloatingActionButton
,ExtendedFloatingActionButton
Icon
IconButton
,IconToggleButton
,FilledIconButton
,FilledIconToggleButton
,FilledTonalIconButton
,FilledTonalIconToggleButton
,OutlinedIconButton
,OutlinedIconToggleButton
LinearProgressIndicator
,CircularProgressIndicator
Switch
Text
Button
(FilledButton
),ElevatedButton
,FilledTonalButton
,OutlinedButton
,TextButton
Card
(FilledCard
),ElevatedCard
,OutlinedCard
DropdownMenu
,DropdownMenuItem
ExposedDropdownMenuBox
,ExposedDropdownMenuBoxScope.ExposedDropdownMenuBoxTextField
,ExposedDropdownMenuBoxScope.ExposedDropdownMenu
,ExposedDropdownMenuWithTextField
FloatingActionButton
,SmallFloatingActionButton
,LargeFloatingActionButton
,ExtendedFloatingActionButton
IconButton
,IconToggleButton
,FilledIconButton
,FilledIconToggleButton
,FilledTonalIconButton
,FilledTonalIconToggleButton
,OutlinedIconButton
,OutlinedIconToggleButton
NavigationBar
,NavigationBarItem
MaterialText
,TaglessText
TextField
,OutlinedTextField
List
/LazyColumnList
(slightly visually inconsistent)
The components in the ext
packages don't follow the androidx.compose
APIs exactly, but rather provide wrappers that are more idiomatic and conventional on both kinds of targets, wrapping different APIs that can't be unified following the androidx.compose
APIs.
The parameter names with suffixes such as "JsDom" or "ComposeUi" are platform-specific, and only apply on their respective platform(s), Compose HTML / JS DOM or Compose UI platforms.
The com.huanshankeji.compose.material.icons.Icon
class delegates to both kinds of targets, but only a few Material Icons are added as PoC. You need to add your concrete icon implementations following the style of the existing ones in com.huanshankeji.compose.material.icons
to use the icons you need. Track the progress of full icon support in #4.
alpha
- size modifiers
size
,sizeIn
,fillMaxSize
width
,widthIn
,fillMaxWidth
height
,heightIn
,fillMaxHeight
padding
background
border
(visually inconsistent)onClick
verticalScroll
,horizontalScroll
(ScrollState
not supported on JS yet)
outerBorder
roundedCornerBackgroundAndOuterBorder
Alignment
Arrangement
KeyboardOptions
KeyboardActions
PaddingValues
The ViewModel module currently supports a small subset of the Compose ViewModel APIs, and delegates to raw UI state on Compose HTML / JS DOM. These APIs are highly experimental now.
The navigation module currently supports a small subset of the Compose Navigation APIs, which does not support transition or animation on Compose HTML / JS DOM. These APIs are also highly experimental now. See CMP-4966 for a bug to avoid. Also, ViewModel-related functions are not implemented yet on Compose HTML / JS DOM.
Maven coordinate:
"com.huanshankeji:compose-multiplatform-html-unified-$module:$version"
More specifically:
"com.huanshankeji:compose-multiplatform-html-unified-common:$version"
"com.huanshankeji:compose-multiplatform-html-unified-material-icons-core:$version"
"com.huanshankeji:compose-multiplatform-html-unified-material2:$version"
"com.huanshankeji:compose-multiplatform-html-unified-material3:$version"
For example, to depend on the Material 3 module with Gradle:
kotlin {
sourceSets {
commonMain {
dependencies {
// ...
implementation("com.huanshankeji:compose-multiplatform-html-unified-material3:$version")
}
}
}
}
View all the artifacts on Maven Central.
This project depends on Kobweb which is not published to Maven Central yet, so you have to add the following Maven repository:
repositories {
mavenCentral()
maven("https://us-central1-maven.pkg.dev/varabyte-repos/public")
}
See the corresponding section in Compose HTML Material for configuring Material Icons on JS.
The Kotlin/JS (Compose HTML) portion of this project depends on Kobweb Compose of Kobweb Silk which is a UI layer built upon Compose HTML that provides Modifier
(type-safe CSS API wrappers) and layout APIs. Here is a list of topics in their README.md that should be helpful when you use this library in Compose HTML, especially if you need to customize the components further on Kotlin/JS (Compose HTML):