Icon Split Button
A split button whose main action is icon-only, for toolbars and other dense chrome.
Show codeHide code
Installation
import { IconSplitButton } from "@makeplane/propel/components/icon-split-button";Usage
IconSplitButton is SplitButton with an icon-only main segment. It
ships no menu of its own — render it as a Menu’s child, with the surface as a sibling
MenuContent. Clicking the main segment fires onClick; the chevron opens the menu.
Both segments are icon-only, so both need an accessible name: aria-label names the main action
and menuLabel names the chevron.
import { Icon } from "@makeplane/propel/components/icon";
import { IconSplitButton } from "@makeplane/propel/components/icon-split-button";
import { Menu, MenuContent, MenuItem } from "@makeplane/propel/components/menu";
import { AddOutline } from "@makeplane/propel/icons";
export default function BasicDemo() {
return (
<Menu>
<IconSplitButton
variant="primary"
size="md"
icon={<Icon icon={AddOutline} />}
aria-label="Create work item"
/>
<MenuContent align="end">
<MenuItem label="Create from template" />
<MenuItem label="Import work items" />
</MenuContent>
</Menu>
);
}Choosing between the two
Reach for IconSplitButton only where a glyph alone names the action unambiguously — a toolbar
+, say. An icon-only main segment gives no way to tell what a plain click will do without
hovering for the tooltip, so anywhere that matters, keep the text label and use SplitButton.
If every path through the control goes through the menu — the glyph only names a category and there is no default action worth firing on its own — this is the wrong component. That is a plain menu trigger, not a split button, and it should not carry a divider.
Examples
Variants
Primary lays the segments out as separate pills; secondary connects them with a divider. There is no tertiary or ghost split button, and no danger palette — both segments are neutral.
Show codeHide code
Sizes
One shared size sizes both segments — sm 24 / md 28 / lg 32 px. Both segments are the same square
box, so the control measures exactly twice its rung height, plus the frame’s 1px gap on primary.
There is no xs: the segments are contiguous, so the 20px rung’s synthesized pointer target would
overlap its neighbour. See Sizing for the full ladder.
Show codeHide code
Loading
loading shows a spinner on the main segment (soft-disabled: still focusable, aria-busy) and
disables the menu segment so the pending action can’t fork.
Show codeHide code
Disabled
disabled disables both segments.
Show codeHide code
API Reference
IconSplitButton
The icon-only split button (Figma "Icon Split button", 9441:1252): two square IconButtons in
the shared SplitButton frame — a main action segment plus a chevron segment grafted as the
surrounding menu's MenuTrigger. Both segments are the same square box at every rung (Figma
measures 24+24, 28+28, 32+32; primary adds the frame's 1px gap, secondary runs them flush), so
neither takes a width override. Neutral only, like SplitButton — no danger/error variant.
Use it over SplitButton only where a glyph alone names the action unambiguously (a toolbar +,
say). An icon-only main segment gives no way to tell what a plain click will do without hovering;
anywhere that matters, keep the text label and use SplitButton.
It ships no menu of its own — render it as a Menu's child, with the surface as a sibling
MenuContent:
``tsx
<Menu>
<IconSplitButton
variant="primary"
size="md"
icon={<Icon icon={Plus} />}
aria-label="Create"
/>
<MenuContent align="end">
<MenuItem label="Create from template" />
</MenuContent>
</Menu>;