Skip to content

Instantly share code, notes, and snippets.

@dharamveer-gupta
Last active February 18, 2026 16:16
Show Gist options
  • Select an option

  • Save dharamveer-gupta/c8139ace8d07b13d28c52d31f0080684 to your computer and use it in GitHub Desktop.

Select an option

Save dharamveer-gupta/c8139ace8d07b13d28c52d31f0080684 to your computer and use it in GitHub Desktop.
Comprehensive breakdown of component support in Compose Multiplatform (CMP).

Breakdown of component support in Compose Multiplatform (CMP)

Symbol Meaning
βœ… Fully Supported (Common Code). No platform-specific code needed.
⚠️ Supported with Caveats. Experimental or slight behavior differences.
🚧 Work in Progress / Beta. Available but may be unstable (e.g., Wasm).
πŸ› οΈ Requires Interop / 3rd Party. No official common component exists yet.

1. Material 3 Components (UI Elements)

Most Material 3 UI components are implemented in pure Kotlin and rendered via Skia, making them identical across platforms.

Component Android iOS Desktop (JVM) Web (Wasm)
Button / FAB βœ… βœ… βœ… βœ…
Card / Surface βœ… βœ… βœ… βœ…
Text / Typography βœ… βœ… βœ… βœ…
TextField (Input) βœ… βœ… (Native text actions added recently) βœ… βœ…
Checkbox / Switch βœ… βœ… βœ… βœ…
Slider / Progress βœ… βœ… βœ… βœ…
Scaffold / AppBars βœ… βœ… βœ… βœ…
Icon / IconButton βœ… βœ… βœ… βœ…
Lazy Lists / Grids βœ… βœ… βœ… βœ…
ModalBottomSheet βœ… βœ… βœ… βœ…
NavigationDrawer βœ… βœ… βœ… βœ…
Snackbar / Toast βœ… βœ… βœ… βœ…
Badge / Chips βœ… βœ… βœ… βœ…
Dialog / Popup βœ… βœ… βœ… (Creates new Window) βœ…
DatePicker βœ… βœ… (Experimental) βœ… (Experimental) βœ… (Experimental)
TimePicker βœ… βœ… (Experimental) βœ… (Experimental) βœ… (Experimental)
PullToRefresh βœ… βœ… βœ… βœ…

2. System & Foundation (Logic & Resources)

These components interact with the underlying operating system.

Component Android iOS Desktop (JVM) Web (Wasm)
Navigation βœ… (Jetpack Nav 2.8+) βœ… (Jetpack Nav 2.8+) βœ… (Jetpack Nav 2.8+) βœ… (Jetpack Nav 2.8+)
Resources (Res) βœ… (compose-resources) βœ… (compose-resources) βœ… (compose-resources) βœ… (compose-resources)
Vector Graphics βœ… (XML vectors) βœ… (XML vectors) βœ… (XML vectors) βœ… (XML vectors)
WindowInsets βœ… βœ… (Notch/Keyboard) βœ… βœ…
Clipboard βœ… βœ… βœ… ⚠️ (Browser security limits)
Mouse / Hover ⚠️ (Stylus support) ❌ βœ… βœ…
Keyboard Shortcuts βœ… βœ… (HW Keyboard) βœ… βœ…
BackHandler βœ… βœ… (Gesture/Swipe) ❌ (N/A) ⚠️ (Browser Back)

3. Missing / Platform-Specific Components

These features require distinct implementations because they rely on heavy native APIs that Skia cannot draw directly.

Component Status Recommended Solution
WebView πŸ› οΈ compose-webview-multiplatform
Google Maps πŸ› οΈ kmp-maps-compose
Camera πŸ› οΈ Peekaboo
Video Player πŸ› οΈ ComposeMultiplatformMediaPlayer
Bluetooth / BLE πŸ› οΈ Kable
Biometrics πŸ› οΈ Moko-biometry
Permissions πŸ› οΈ Moko-permissions
HTML / Markdown πŸ› οΈ multiplatform-markdown-renderer

Key Platform Nuances

iOS (Native Interop)

  • Rendering: CMP on iOS uses a Skia canvas. It does not translate to UIView.
  • Scroll Physics: iOS scroll physics (rubber-banding) are natively supported.
  • Selection: Native text selection handles are supported.
  • Interop: You can place a UILabel inside Compose using UIKitView, or place Compose inside a SwiftUI view using ComposeViewController.

Desktop (JVM)

  • Window Management: Has unique APIs (Window, Tray, MenuBar) that don't exist on mobile.
  • Dialogs: Dialog and Popup often create a separate undecorated window rather than an overlay.

Web (Wasm)

  • Status: Currently in Alpha/Beta.
  • Fonts: Must be loaded explicitly as resources; cannot rely on system fonts as easily.
  • Multithreading: Limited support (coroutines run on Main thread mostly).

Summary for Developers

If it is a visual component (Button, Row, Text), it works everywhere. If it is a hardware component (Camera, GPS, Bluetooth), you need a third-party library or expect/actual native implementations.


CMP Component & Library Support Matrix

Compose Multiplatform (CMP) component support and their recommended library solutions for missing native features

Category Component / Feature Android iOS Desktop Web (Wasm) Recommended Library / Notes
UI Core Material 3 (Buttons, Cards, etc.) βœ… βœ… βœ… βœ… Built-in (Pure Kotlin)
UI Core Text & Typography βœ… βœ… βœ… βœ… Built-in
UI Core Lazy Lists & Grids βœ… βœ… βœ… βœ… Built-in
UI Core TextField (Input) βœ… βœ… βœ… βœ… Built-in
Navigation Navigation Component βœ… βœ… βœ… βœ… Jetpack Navigation
Resources Images, Fonts, Strings βœ… βœ… βœ… βœ… compose-resources
Media WebView πŸ› οΈ πŸ› οΈ πŸ› οΈ πŸ› οΈ compose-webview-multiplatform
Media Video Player πŸ› οΈ πŸ› οΈ πŸ› οΈ πŸ› οΈ ComposeMultiplatformMediaPlayer
Hardware Camera πŸ› οΈ πŸ› οΈ ❌ ❌ Peekaboo
Hardware Google Maps πŸ› οΈ πŸ› οΈ ❌ ❌ kmp-maps-compose
Hardware Bluetooth (BLE) πŸ› οΈ πŸ› οΈ πŸ› οΈ πŸ› οΈ Kable
System Permissions πŸ› οΈ πŸ› οΈ ❌ ❌ Moko-permissions
System Biometrics πŸ› οΈ πŸ› οΈ ❌ ❌ Moko-biometry
Data Local Database πŸ› οΈ πŸ› οΈ πŸ› οΈ πŸ› οΈ Room or SQLDelight
Data Markdown Rendering πŸ› οΈ πŸ› οΈ πŸ› οΈ πŸ› οΈ multiplatform-markdown-renderer

Implementation Strategy

Because CMP renders via the Skia/Skiko engine, it effectively draws its own UI on a canvas. This is why standard UI components work everywhere, while hardware-dependent features (like the Camera) require "bridges."

  • For βœ… (Green): Simply use the standard androidx.compose or org.jetbrains.compose imports in your commonMain folder.
  • For πŸ› οΈ (Wrench): Add the library dependency to your commonMain in build.gradle.kts. These libraries use expect/actual to talk to the underlying OS (e.g., UIKit for iOS and Android Views for Android).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment