Skip to content

Agent skill · material3 1.5.0-beta02

Material 3 Expressive Compose code your agent gets right

A skill for Claude Code, Codex, Cursor and Copilot. It knows which Expressive APIs are stable, which still need an opt-in, and what changed since 1.4.0. Every Kotlin sample it reads is compiled in CI.

The skill in 78 seconds. Download the MP4

Material 3 Expressive in Compose spans many material3 versions. API names changed between 1.5.0 alphas, most of Expressive was internal in 1.4.0, and almost all of it became stable in the 1.5.0 betas. An agent working from memory mixes these versions up. This skill gives it the facts for the version you actually use.

Invented APIsAgents guess names like ExpressiveButton or a shape parameter that doesn’t exist. The skill lists the real composables and their parameters, taken from the beta02 sources.
Wrong opt-insAgents add @OptIn to everything, or forget it on LoadingIndicator. The skill marks each API stable, opt-in or internal, for each version.
Deprecated codeListItem(headlineContent = …), the old SearchBar, TopSearchBar: deprecated in beta02. The skill gives the replacement for each.
Code that compilesAll 28 Kotlin samples live in a Gradle module that CI builds against material3 1.5.0-beta02. What the agent reads is code that built.
API1.4.01.5.0-beta02
MaterialExpressiveTheme · MotionScheme.expressive()InternalStable
Typography.*Emphasized · Shapes.largeIncreasedInternalStable
ButtonGroup · ToggleButton · SplitButtonLayoutNot thereStable
FloatingActionButtonMenu · MediumFloatingActionButtonNot thereStable
HorizontalFloatingToolbar · LargeFlexibleTopAppBarNot thereStable
ShortNavigationBar · WideNavigationRailStableStable
SegmentedListItem · LinearWavyProgressIndicatorNot thereStable
LoadingIndicator · ContainedLoadingIndicatorNot thereOpt-in
MaterialShapes · RoundedPolygon.toShape()Not thereOpt-in

The full table, every deprecation, and how it was made: API status by version.

Make one screen expressive, not every pixel

Section titled “Make one screen expressive, not every pixel”

Google’s research behind M3 Expressive found that people spotted key UI elements up to four times faster on expressive screens. So the skill treats expressive design as a way to guide attention, not as decoration. Pick the one primary action, give it a contrasting shape and the strongest color, and save the big moments for one or two places in the product. Read the design rules.

Selection changes shape as well as color: tonal rounded squares, and a primary pill for the selected one. Try it.
What the skill writes for that, in Compose
@Composable
fun PeriodPicker(options: List<String>) {
var selected by rememberSaveable { mutableIntStateOf(0) }
// Connected button group = single-select segmented control with expressive shapes.
// Replaces SingleChoiceSegmentedButtonRow when you want the M3 Expressive look.
FlowRow(horizontalArrangement = Arrangement.spacedBy(ButtonGroupDefaults.ConnectedSpaceBetween)) {
options.forEachIndexed { index, label ->
ToggleButton(
checked = selected == index,
onCheckedChange = { selected = index },
shapes = when (index) {
0 -> ButtonGroupDefaults.connectedLeadingButtonShapes()
options.lastIndex -> ButtonGroupDefaults.connectedTrailingButtonShapes()
else -> ButtonGroupDefaults.connectedMiddleButtonShapes()
},
modifier = Modifier.weight(1f).semantics { role = Role.RadioButton },
) { Text(label) }
}
}
}

The skill also covers MaterialShapes. The shapes below are drawn from material3’s own polygon definitions, run through androidx.graphics.shapes. Click a shape to copy its Compose call.

Shapes and morphing in Compose →

MotionScheme.expressive() replaces fixed durations with springs. Spatial springs (size, position, corners) may overshoot. Effects springs (color, alpha) never do. Press play to compare them; the damping and stiffness values come straight from the material3 tokens.

Expressive · fast spatialdamping 0.6 · stiffness 800
Expressive · default spatialdamping 0.8 · stiffness 380
Standard · default spatialdamping 0.9 · stiffness 700
Effects · default (color, alpha)damping 1 · stiffness 1600

MotionScheme in depth →

FAB menu: tap the FAB
Wavy progress and the loading indicator
Inside a Claude Code session
/plugin marketplace add sanikantv/m3-expressive-skill
/plugin install m3-expressive-compose@m3-expressive-skill
Or from your shell
claude plugin marketplace add sanikantv/m3-expressive-skill
claude plugin install m3-expressive-compose@m3-expressive-skill

Then ask your agent for UI work as usual, or call the skill directly:

/m3-expressive-compose build a settings screen with segmented list items and a floating toolbar
/m3-expressive-compose review app/src/main/java/com/example/HomeScreen.kt against M3 Expressive

Full setup guide →

Built by Sanikant. Set in Google Sans Flex (SIL Open Font License), icons from Material Symbols (Apache 2.0). Material Design is a Google trademark; this project is not affiliated with Google.