Skip to content

Compose Shelf

The missing Material 3 Side Sheet that Google never shipped for Compose. Modal, Standard & Adaptive variants — works on Android, iOS, Desktop, and Web.

The Problem

Google’s Material 3 spec defines Side Sheets as a core component for displaying supplementary content alongside the main UI. They shipped View-based SideSheetBehavior and SideSheetDialog in Material 1.8.0, but Compose has zero implementation — no first-party, no third-party.

If you’re building a Compose Multiplatform app that needs a detail panel, filter sheet, or info overlay on tablets and foldables, you’re on your own. Until now.

See It in Action

Desktop

Desktop Demo

Foldable (Pixel 9 Pro Fold — Unfolded)

Foldable Demo

Phone (Pixel 9 Pro Fold — Folded)

Android Phone Demo

Why Compose Shelf?

M3 Spec Compliant

28dp corner radius, Level 1 elevation, drag handle, scrim, accessibility semantics — all per the Material 3 specification.

Compose Multiplatform

Works on Android, iOS, JVM Desktop, and WasmJs. Single API across all platforms.

Three Variants

Modal (popup with scrim), Standard (inline, no scrim), and Adaptive (side sheet on tablets, bottom sheet on phones).

Fully Customizable

Every parameter has an M3-compliant default but is overridable — colors, shape, elevation, width, drag handle, edge, and gestures.

How It Works

Compose Shelf is built entirely on compose.foundation — no Material dependency required. The core uses AnchoredDraggableState for physics-based swipe-to-dismiss, Popup for modal overlay, and BoxWithConstraints for adaptive layout switching.

ComponentWhat it doesWhen to use
ModalSideSheetPopup overlay with scrim + swipe-to-dismissTemporary detail panels, filters, settings
StandardSideSheetInline panel, no popup or scrimPersistent side panels on wide screens
AdaptiveSheetSide sheet on ≥600dp, bottom sheet on phonesApps targeting both phones and tablets

Quick Example

var showSheet by remember { mutableStateOf(false) }
if (showSheet) {
ModalSideSheet(
onDismissRequest = { showSheet = false },
) {
Text("Sheet content", modifier = Modifier.padding(24.dp))
}
}

M3 Spec Compliance

FeatureStatus
28dp corner radius (cornerLarge)Implemented
Level 1 elevation shadowImplemented
Drag handle indicatorImplemented
Scrim overlay (32% black)Implemented
Swipe-to-dismissImplemented
Start/End edge with RTLImplemented
Accessibility (paneTitle, dismiss)Implemented
No swipe-to-open (per spec)Correct

Platform Support

PlatformArtifactStatus
Androidshelf-androidStable
JVM Desktopshelf-jvmStable
iOS arm64shelf-iosarm64Stable
iOS Simulator arm64shelf-iossimulatorarm64Stable
iOS x64shelf-iosx64Stable
WasmJsshelf-wasmjsStable

Zero Material Dependency

Compose Shelf depends only on compose.runtime, compose.foundation, compose.ui, and compose.animation. It works with Material 3, Material 2, or your own custom design system.