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.
Why agents get M3 Expressive wrong
Section titled “Why agents get M3 Expressive wrong”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.
ExpressiveButton or a shape parameter that doesn’t exist. The skill lists the real composables and their parameters, taken from the beta02 sources.@OptIn to everything, or forget it on LoadingIndicator. The skill marks each API stable, opt-in or internal, for each version.ListItem(headlineContent = …), the old SearchBar, TopSearchBar: deprecated in beta02. The skill gives the replacement for each.API status at a glance
Section titled “API status at a glance”| API | 1.4.0 | 1.5.0-beta02 |
|---|---|---|
MaterialExpressiveTheme · MotionScheme.expressive() | Internal | Stable |
Typography.*Emphasized · Shapes.largeIncreased | Internal | Stable |
ButtonGroup · ToggleButton · SplitButtonLayout | Not there | Stable |
FloatingActionButtonMenu · MediumFloatingActionButton | Not there | Stable |
HorizontalFloatingToolbar · LargeFlexibleTopAppBar | Not there | Stable |
ShortNavigationBar · WideNavigationRail | Stable | Stable |
SegmentedListItem · LinearWavyProgressIndicator | Not there | Stable |
LoadingIndicator · ContainedLoadingIndicator | Not there | Opt-in |
MaterialShapes · RoundedPolygon.toShape() | Not there | Opt-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.
@Composablefun 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 35 Material shapes
Section titled “The 35 Material shapes”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 →
Springs, not durations
Section titled “Springs, not durations”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.
Every Expressive component
Section titled “Every Expressive component”Install
Section titled “Install”/plugin marketplace add sanikantv/m3-expressive-skill/plugin install m3-expressive-compose@m3-expressive-skillclaude plugin marketplace add sanikantv/m3-expressive-skillclaude plugin install m3-expressive-compose@m3-expressive-skillnpx --yes skills add sanikantv/m3-expressive-skill --skill m3-expressive-compose -ygit clone https://github.com/sanikantv/m3-expressive-skill.gitcp -r m3-expressive-skill/skills/m3-expressive-compose .claude/skills/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 ExpressiveQuestions
Section titled “Questions”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.