Communication
Badges, progress and loading indicators, snackbars and tooltips — the M3 Expressive feedback components, with the wavy progress shape, the 4dp track gap and stop indicator, and the 7-shape loading morph.
Badges
Small badges flag unread state; large badges carry a count up to 999+. Both use error / on-error and anchor to the icon's top-trailing corner exactly like Compose BadgedBox: x = icon width − offset, y = −badge height + offset. Screen readers hear a summary (“3 new”, “More than 999 new”) instead of the visual label.
Linear progress
Active indicator in primary, track in secondary-container (the token value; the MDC Android docs still say primary-container), a 4dp gap between them and a 4dp stop dot at the track end that disappears at 100%. Flat progress moves on a spring (ζ 1 / k 50, about 1.3s). Wavy progress tweens 500ms linear; its wave flattens at ≤ 10% and ≥ 95% with 500ms amplitude ramps. Indicators mirror in RTL.
Circular progress
40dp flat and 48dp wavy by default (44 / 52dp thick). The indeterminate indicator now shows its track; its arc grows from 10% to 87% and back (3s each way, standard easing) while it spins 1080° per 6s plus a 90° emphasized-decelerate step every 1.5s.
Loading indicator
For waits between 200ms and 5s: show nothing below 200ms and a progress indicator past 5s. Seven shapes morph every 650ms on a ζ 0.6 / k 200 spring that overshoots about 9.5%, each adding a quarter turn on top of a 360° / 4666ms linear spin. With reduced motion the morph stops and only the slow spin remains.
- 1. Soft burst
- 2. 9-sided cookie
- 3. Pentagon
- 4. Pill
- 5. Sunny
- 6. 4-sided cookie
- 7. Oval
Snackbar
Brief messages at the bottom of the screen, above the navigation bar on phones. One at a time: the next waits until the current one has faded out. Enter and exit scale 0.8 ↔ 1 on the fast spatial spring with a fast effects fade. Swipe sideways to dismiss; hovering or focusing pauses the timer.
Tooltips
Plain tooltips label icons. Rich tooltips add a subhead and actions and stay open while you hover them; the persistent kind opens on click and takes focus so its actions are reachable by keyboard. Hover opens with no delay (as in Compose BasicTooltipBox), keyboard focus opens too, Escape closes, and the trigger gets aria-describedby. Show and hide scale 0.8 ↔ 1 on the fast spatial spring with a fast effects fade.
Skeleton
Placeholders in on-surface at 10%, so they show on any surface, filled cards included, with the M3 corner scale and a slow, synchronized pulse. Content fades in quickly once loaded.
Left: on surface. Right: on surface-container-highest (a filled card).