Dropdown button.
A button whose entire face — label and chevron together — opens an attached menu of closely related actions. One control, one hit target, no separate chevron zone. Use it when a single action has two or three named variants people need often enough to keep one click away, not as a catch-all for unrelated commands.
Try it
Anatomy
One control. No divider, no second hit target — the chevron is decoration that signals a menu, not an independent button.
Size
Three sizes, identical heights to Buttons (28/38/48px) — a Dropdown button lines up with a Button next to it.
28px38px48pxStyle & states
Filled, Border and Borderless, each across Default, Hovered, Pressed and Disabled — the full matrix from the Figma component.
No semantic Type axis exists for this component — unlike Buttons (primary/neutral/success/danger), Filled Dropdown button is always the accent green. If a danger or success variant turns out to be needed (e.g. a destructive action with alternatives), that is new scope for the Figma file, not something this page should invent.
The attached menu
Menu items are the Context menu component (/menu) — same surface, same row anatomy, same do/don't rules for labels and icons. This page only covers the trigger and the keyboard model specific to it.
Do & don't
Specification
Every value is a token, ported from the Figma component.
Accessibility
The W3C APG 'menu button' pattern — one activatable control, a menu it owns, and a documented keyboard model.
Props (React)
Proposal — no React primitive ships yet. This is the target shape, not an import.
type DropdownButtonProps = {
size?: "s" | "m" | "l"; // 28 / 38 / 48px, default "m"
style?: "filled" | "border" | "borderless"; // default "border"
disabled?: boolean;
label: ReactNode; // the default action — verb + noun
items: Array<{
label: ReactNode;
onSelect: () => void;
disabled?: boolean;
}>; // 2-4 named variants of the default action
};