Skip to main content

SplitButton

A button combining a primary action with a dropdown for secondary options. Use when one action is clearly dominant but related alternatives are available. Don't use when actions are equally weighted — use ButtonGroup instead.

Figma Storybook Docs

Description

What it does

Presents a primary action as a labelled button alongside a small chevron trigger that opens a dropdown menu of related secondary actions. Clicking the main label fires the primary action immediately; clicking the chevron reveals alternatives without committing to anything.

Where it appears

Record-level toolbars in Open Point (e.g. a stakeholder profile header, a consultation record action bar) and in data-table row actions where one action dominates — for example Save as Draft vs Save and Publish vs Save and Notify.

Why it exists

Government workflows frequently have a clear primary path (submit, publish, approve) alongside less-frequent but contextually related alternatives (save draft, schedule, export). Surfacing all options as equal buttons adds visual noise and slows task completion. The split button preserves hierarchy while keeping alternatives discoverable without a full overflow menu.

Anatomy

PartRequired?Notes
Primary action segment Required A standard button label that fires the primary action on click. Inherits all button variants (primary, secondary, danger). Width grows with label length.
Divider Required A 1px vertical rule separating the primary segment from the chevron segment. Uses --op-color-border-default at reduced opacity so it reads as internal structure, not a boundary.
Chevron trigger segment Required A fixed-width (36px minimum, 44px touch) segment containing a downward-pointing chevron icon. Activates the dropdown on click or Enter/Space. Has its own focus state, hover state, and active state independent of the primary segment.
Dropdown menu Required A DropdownMenu panel anchored below the chevron segment. Contains secondary action items. Should include 2–5 items; more than 5 items indicates the component is being misused.
Dropdown item Required Each item in the dropdown. May include a leading icon for differentiation. Destructive items use --op-color-status-error and appear last, separated by a divider.
Focus ring Required 3px solid --op-color-interactive-focus. Applied independently to the primary segment and to the chevron segment — both are separately focusable and both display the ring.

Variants

Primary

High-emphasis affirmative action (green fill)

The dominant action is the recommended or most common path — e.g. 'Publish' on a consultation record.

Secondary

Medium-emphasis action (outlined, no fill)

The primary action is important but not the single recommended path — e.g. 'Export' where multiple formats are available.

Danger

Destructive or irreversible primary action (red fill)

The dominant action itself is destructive — e.g. 'Archive' with alternatives like 'Archive and Notify' or 'Archive All'. Use sparingly; confirm via dialog before executing.

States

State Behaviour
Default Primary segment and chevron segment render at rest. Divider visible. Dropdown hidden.
Primary segment — hover Primary segment background lightens to --op-color-interactive-hover. Chevron segment unchanged. Cursor is pointer.
Chevron segment — hover Chevron segment background lightens to --op-color-interactive-hover. Primary segment unchanged.
Primary segment — focus 3px focus ring on primary segment only. Keyboard Enter or Space fires the primary action.
Chevron segment — focus 3px focus ring on chevron segment only. Keyboard Enter, Space, or ArrowDown opens the dropdown.
Open (dropdown visible) Chevron rotates 180deg (if motion permitted). Dropdown panel appears below chevron segment. First dropdown item receives focus. Clicking outside or pressing Escape closes the dropdown and returns focus to the chevron segment.
Disabled Both segments are non-interactive. Opacity 40% (--op-color-interactive-default at 0.4). Cursor is not-allowed. The entire component, including the chevron trigger, is inert. No dropdown can be opened.
Loading Primary segment shows a wa-spinner replacing the label. Chevron segment is disabled until the primary action resolves. Used when the primary action triggers an async operation (e.g. publishing a consultation).

Usage guidelines

When to use

  • One action is clearly dominant and users will choose it the majority of the time — the label should reflect that dominant action.
  • Secondary actions are related to the same object or workflow — e.g. all variants of saving or publishing a record.
  • Screen space is constrained and showing all actions as separate buttons would cause toolbar overflow.
  • The dropdown contains 2–5 alternatives, not a full action menu.

When not to use

  • Actions are equally weighted — use ButtonGroup instead so no false hierarchy is implied.
  • There is only one action available — use a standard Button.
  • The dropdown would contain more than five items — use an OverflowMenu or restructure the workflow.
  • The primary action is unclear or changes depending on context — use an explicit ButtonGroup or DropdownMenu with a neutral trigger.
  • You need inline actions inside a data table cell — use an IconButton or RowActionMenu instead to preserve row height.

Do / Don't

Do

Label the primary segment with a specific verb that describes the dominant action: 'Publish', 'Send', 'Approve'.

Don't

Use vague labels like 'Actions' or 'Options' — those belong on a plain DropdownMenu trigger, not a split button.

Do

Keep dropdown items contextually related to the primary action — variants of the same operation.

Don't

Mix unrelated actions in the dropdown (e.g. 'Delete' alongside 'Export as CSV') — this creates confusion about the action group's purpose.

Do

Place destructive dropdown items last, after a visual divider, and label them clearly (e.g. 'Archive and Delete All Responses').

Don't

Lead with destructive items or mix them among neutral items without separation.

Do

Disable the entire component (both segments) when the user lacks permission to perform any of the actions.

Don't

Disable only the primary segment and leave the chevron active — this implies alternatives are available when they should also be restricted.

Was this page helpful?

Updated 9 September 2026