What it does
Split button renders two adjacent real button controls: the primary side fires onClick, while the trigger side opens a menu of secondary items. Disabled and loading states disable both halves and prevent the dropdown from opening.
Composition and API
Import SplitButton from the split-button entrypoint. Provide label, items, and optional onClick. Items use id, label, icon, disabled, and onSelect. The component also accepts appearance, variant aliases, size, startIcon, fullWidth, open, defaultOpen, and onOpenChange.
Common use cases
Reach for Split button when a default action has nearby alternatives: Save with Save As and Export, Publish with Schedule and Preview, Send with Save draft and Send copy, or Archive with Duplicate and Move.
Accessibility
Both halves are native buttons. The menu trigger exposes aria-haspopup, aria-expanded, and an accessible label. Menu focus movement, Escape handling, Home, End, ArrowUp, and ArrowDown behavior are delegated to the shared Dropdown primitive.
Next.js integration notes
Split button is a client component because it uses interactive dropdown state. Render it in client components or inside interactive islands in App Router pages.
FAQ
Can the menu open state be controlled?
Yes. Pass open and onOpenChange to control the dropdown trigger state from parent state.
Can menu items include icons?
Yes. Add an icon to any item. The item label remains the accessible menu item name.
How do variant aliases map to Button appearances?
The variant prop supports primary, secondary, outline, ghost, danger, and success. These map to the existing Button appearance system, and the appearance prop can be used directly for the full tokenized palette.