Split Button

A button that runs the most common action, joined to a menu of related alternatives.

Primary

SplitButton.Root is a Dropdown.Root. Put the leading SplitButton.Action, the chevron SplitButton.Trigger and an ordinary Dropdown.Content inside it. The trigger shows only an icon, so give it an aria-label.

Secondary with options

Without mode, both halves use the secondary button style. The menu can change what the action does. Here it picks which checks run, and keeps itself open while you toggle them.

Ghost

Use mode="ghost" inside toolbars. Hovering either half also tints the other, so the pair reads as one control. Remove the root's shadow with shadow-none when it sits on a flat surface.

Sizes

size on the root applies to both halves.

Disabled and loading

disabled on the root disables both halves. Each half also takes its own disabled, and the action takes the button's loading prop. Disable the trigger while the action is loading so the menu cannot start a second run.

Give SplitButton.Action an href to render it as a link.

SplitButton.Root Properties

mode
'primary''secondary''tertiary''ghost''subtle''destructive''dashed'

Button style shared by both halves.

Default: secondary

size
'micro''small''regular''large'

Button size shared by both halves.

Default: regular

disabled
boolean

Disables both halves.

Default: false

open
boolean

Whether the menu is open, when controlled.

defaultOpen
boolean

Whether the menu starts open, when uncontrolled.

onOpenChange
(open: boolean) => void

Called when the menu opens or closes.

modal
boolean

Whether the open menu blocks interaction with the rest of the page. Always true inside a dialog or drawer.

Default: false

className
string

Additional classes for the wrapper around both halves.

SplitButton.Action Properties

children
ReactNode

Label of the action.

href
string

Renders the action as a link to this destination.

iconStart
ButtonIcon

Icon before the label.

loading
{ isLoading?: boolean; className?: string }

Shows a spinner in place of the icon and disables the action.

disabled
boolean

Disables the action. Defaults to the root's disabled.

mode
ButtonMode

Overrides the root's mode for this half.

size
ButtonSize

Overrides the root's size for this half.

className
string

Additional classes for the action. Other Button props are passed through.

SplitButton.Trigger Properties

aria-labelRequired
string

Accessible name of the icon-only menu trigger, such as More ways to create.

iconStart
ButtonIcon

Icon of the trigger.

Default: chevron-down

disabled
boolean

Disables the trigger. Defaults to the root's disabled.

mode
ButtonMode

Overrides the root's mode for this half.

size
ButtonSize

Overrides the root's size for this half.

className
string

Additional classes for the trigger. Other Button props are passed through.