Button
A 48 dp action button with five kinds: outlined, primary, destructive, text and disabled.
Consumer provides: the label (a verb that says what happens: "Copy pages", "Convert to text"), an optional leading 18 dp icon, the kind, and the click handler.
Kinds
| Kind | Look | Use for |
|---|---|---|
| Outlined | 1 dp outline, ink text |
Cancel and every secondary action. Always placed before the primary. |
| Primary | forest fill, on-forest text |
The one action that completes the dialog: Save, Set, Apply, Create. One per view. |
| Destructive outlined | 1 dp urgent, urgent text |
A destructive action shown in a list or row (Sign out, Remove). |
| Destructive filled | urgent fill |
Only the confirm button of a delete/discard confirmation. |
| Text | forest text, no outline |
Secondary actions that don't close anything: Today, Reset to defaults, Write again. |
| Disabled | sage fill, muted text |
A primary that can't run yet (Create with an empty name). Keep it visible; don't hide it. |
Rules
- 48 dp tall (
control-height), 20 dp side padding (12 for text buttons),radius-md, 8 dp apart. - Label: phone 14 sp Medium; tablet 18 sp Medium (
tablet-button). - Busy: a static hourglass replaces the label in place and the button keeps its width.
- Focus: 2 dp
forestring, 2 dp offset. - Don't put two primaries side by side; don't use a filled red button outside a confirmation dialog.
Compose
OutlinedButton / Button / TextButton with shape = RoundedCornerShape(8.dp), contentPadding = PaddingValues(horizontal = 20.dp), elevation = null, colours from the theme tokens.
In the app
InkActionButton and InkTextButton share pen-aware input.
- An optional 18 dp leading icon sits before the label.
- Destructive outlined buttons are used for rows and lists, including Delete ToDo.
- Disabled buttons have no outline.
- While
busy, a static hourglass (ic_hourglass, Tabler “hourglass-high”) replaces the label. The hidden label keeps the button's width. - There is no spinner and no flip.
busyLabel(“Saving…”, “Sending…”) is what a screen reader announces.- Only the pressed button is busy. Busy text is never swapped into a label by hand.
InkPlainButtonis the text kind: borderless, forest, 12 dp padding, for section headers and actions that close nothing. It takes the samebusyandbusyLabel.- Never depend on colour alone.
Preview
Phone · 14 sp Medium
Tablet · 18 sp Medium