Split Button

A primary action with its alternatives folded beside it.

v1.0.0·Updated Jul 8, 2026 · 10:45
Live Demo — Fully Interactive
Primary click acts; the chevron opens alternatives
Configuration
Variant
Size
Label
<SplitButton variant="primary">Save</SplitButton>
Behavior — The Engineering Contract
Prop / eventTypeNotes
onClick() => voidThe default action, fired by the main button
options{ label, onSelect, danger? }[]The alternatives behind the chevron
variantprimary · brand · ghostShared skin for both halves
sizeS · M · LMatches Button; M is the default
disabledbooleanLocks main and toggle together
Esc · outside click · selectEach closes the menu

Use a Split Button when one action dominates and a few siblings share its verb. If no action leads, use a plain Button beside a Menu instead.

Anatomy
Save
1Main actionThe default verb; a normal Button, minus its right radius.
2Divider1px hairline splitting the two hit areas.
3ToggleChevron opening the menu; rotates 180° when open.
Do's and Don'ts
✓ Do
Save

Put the most common action on the main button; hide its variations.

✕ Don't
Choose…

Don't make the main button a placeholder. If nothing leads, use a Dropdown.

✓ Do
Publish

Keep the siblings in the same family — Publish, schedule, publish as draft.

✕ Don't
Save
Send

Don't line up two warm split buttons. One leading action per view still holds.

In context: Examples
A · Editor toolbar
Save

Save leads; save-and-duplicate and save-as-template wait in the menu.

B · Publish flow
Publish

The one warm action, with schedule and draft folded beside it.

C · Row action
Export

A quiet ghost split in a table row: export CSV, JSON or PDF.

Measurements & Tokens
TokenValueRole
--split-toggle-w34pxChevron half width
--split-divider1px rgba(0,0,0,.16)Seam between the halves
--split-menu-bg#141519Menu panel
--split-menu-border#262A30Menu hairline
--split-opt-hover#1E1F25Row hover fill
--split-chevron180° · .2sToggle rotation when open
Code
<div class="o-split">
  <button class="o-btn o-btn--m o-btn--primary o-split__main">Save</button>
  <button class="o-btn o-btn--m o-btn--primary o-split__toggle"
          aria-haspopup="menu" aria-expanded="false" aria-label="More save options">
    <svg class="o-split__chevron">…</svg>
  </button>
  <div class="o-split__menu" role="menu" hidden>
    <button role="menuitem" class="o-split__opt">Save and duplicate</button>
    <button role="menuitem" class="o-split__opt">Save as template</button>
  </div>
</div>