Action placement
Where actions go on a page, in which order, and which button variant each one takes.
Users find an action faster when it sits where they expect it, next to what it changes. These rules decide where an action goes and how much emphasis it gets.
Principles
- Close to what it changes. An action that affects the whole object goes in the page header; one that affects a table goes in the table toolbar; one that affects a single row goes in that row; one that affects a field goes beside the field.
- Navigation left, actions right. Breadcrumbs, back links and tabs start on the left. Toolbars of actions are right-aligned.
- One primary action per view. Only one
default(filled) button is visible at a time on a page or in a dialog. Everything else isoutline,secondaryorghost. - Hide what the user may not do; disable what they cannot do yet. A missing permission hides the action. A temporary state (nothing selected, a scan running) disables it, with a tooltip that says why.
Where actions go
| Level | Place | Contains | Component |
|---|---|---|---|
| Page | The right side of the page header | Actions on the object or list the page shows: Create, Edit, Delete, Export | Page Header actions |
| Workflow | The bottom of a form, right-aligned; sticky on long forms | Finishing a task: Save, Submit, Cancel | A footer row, Dialog footer |
| Section | The header of a card or section | Actions on that section’s content | Card CardAction, Section Heading action |
| Table | The toolbar above the table | Search and filters on the left; Create, bulk actions, Export and view options on the right | Toolbar row above Table |
| Row | The last cell of the row | One frequent action at most, inline; the rest in a menu | Button ghost, Dropdown Menu |
| Value | Beside the value, revealed on hover and focus | Copy, pivot | Copy Button ValueActions |
| Field | Inside or beside the field | Show a password, generate a key, clear the value | Input Group |
Alerts
<PageHeader
className="w-full"
title="Alerts"
icon={<ShieldAlertIcon />}
hint="Every alert raised by your detection rules in the last 90 days."
actions={
<>
<Button variant="outline">
<DownloadIcon data-icon="inline-start" />
Export
</Button>
<Button>
<PlusIcon data-icon="inline-start" />
New rule
</Button>
</>
}
/>Order
Page header
From left to right, inside the right-aligned group:
- Actions on the object: Edit, Delete, Resolve.
- Actions on the content: filters, the date window.
- Actions on the layout: switch view, full screen.
- Generic actions: Share, Export.
When more than three actions compete for the header, keep the most used visible and move the rest into a Dropdown Menu behind an icon button named “More actions”.
Footers
Dialogs, sheets and forms end with their finishing actions, right-aligned. The way out comes first and the primary action last, so the primary action sits at the edge where the eye ends:
- Alternative actions, if any (Save draft).
- The way out (Cancel, Close).
- The primary action (Save, Create rule, Delete asset).
This is the order DialogFooter and AlertDialogFooter lay out, and it reverses on narrow
screens so the primary action is on top. Keep it in every footer; mixing orders makes users
click the wrong button.
Emphasis
| Action type | Variant | Examples |
|---|---|---|
| Primary: moves the task forward; one per view | default |
Save, Create rule, Submit |
| Secondary: everything else that matters | outline or secondary |
Export, Edit, Copy |
| Tertiary: frequent, low-stakes, dense areas | ghost |
Row actions, toolbar icons |
| Destructive: deletes or cannot be undone | destructive, after a confirmation |
Delete asset, Revoke key |
| Way out: leaves without changes | outline or ghost |
Cancel, Close |
| Inline navigation that looks like text | link |
View all alerts |
In a dialog that exists to confirm a destructive action, the destructive button is the primary
action: it takes the destructive variant and no other button is filled.
Actions on several items
When a table supports selection, its bulk actions appear in the table toolbar while items are selected.
- Enable an action that works without a selection, or applies to at least one selected item.
- Disable an action that applies to none of the selected items, or needs a different count (Compare needs two). Show why in a tooltip.
- Ask before a partial run. When some selected items cannot take the action, say how many and why, and offer to run it on the rest: “3 of 12 alerts are already closed. Resolve the other 9?” with the button “Resolve 9 alerts”.
- Keep the selection after the action, so the user can act again on what failed.
- Report the result as described in Messages and feedback.
Rows
- Put at most one action inline in a row, and only when users take it often. Everything else goes
in a row menu: a
ghosticon button namedActions for <row name>. - Make the whole row open the item’s details when there is a detail view. Inline actions stop the click from also opening the row.
- Reveal copy and pivot actions on hover and keyboard focus with
ValueActions, so a dense table does not grow a column of icons.
Menus
- Order the items of a row or “More actions” menu by frequency, in groups split by separators.
- Destructive items go last, after a separator, with
variant="destructive": Delete and Revoke never sit between harmless items, where a slip of the pointer reaches them. - An item that opens a dialog keeps the verb of the dialog’s action: “Delete asset” opens the confirmation whose button is “Delete asset”.