Installation
Props
Button
Compact bordered action button with muted idle text, darker hover text, optional ripple feedback, and shadcn-style size controls.
childrenReactNodeRequired
classNamestringsize"sm" | "md" | "lg"Default "md"
disableRipplebooleanDefault false
showBorderbooleanDefault true
Most standard button props such as type, disabled, onClick, name, value, aria-*, and data-* are forwarded to the underlying motion button.
The public prop surface intentionally leaves out the native drag and CSS animation callback props because they conflict with Motion's own handler names.
IconButton
Icon-only toolbar action that shares the same compact border, muted idle tone, and optional ripple behavior as Button.
childrenReactNodeRequired
classNamestringsize"sm" | "md" | "lg"Default "md"
disableRipplebooleanDefault false
showBorderbooleanDefault true
ButtonGroup
Slot-aware flex wrapper for arranging adjacent controls with horizontal or vertical rounding rules.
childrenReactNodeRequired
orientation"horizontal" | "vertical"Default "horizontal"
classNamestringButtonGroupText
Non-interactive text segment for labeling a group without leaving the shared button-group surface.
childrenReactNodeRequired
renderuseRender render propclassNamestringButtonGroupSeparator
Separator segment for splitting labels, buttons, inputs, and grouped actions inside ButtonGroup.
orientation"horizontal" | "vertical"Default "vertical"
classNamestringButtonGroupItems
Segmented button shell that converts valid child elements into compact internal buttons with muted idle text and darker hover states.
childrenReactNodeRequired
classNamestringsize"sm" | "md" | "lg"Default "md"
showDividersbooleanDefault true
disableRipplebooleanDefault false
Only valid React elements are rendered. Non-element children are ignored.
The child node itself is not preserved; ButtonGroupItems reads each child's props and children, then renders a fresh motion button for that slot.
When showDividers is false, hover feedback moves as a shared spring layer between items instead of flashing independently on each button.
SegmentedControl
String-based segmented selector with compact sizing, keyboard support, muted idle labels, and a spring-driven selected indicator.
optionsstring[]Required
valuestringonChange(value: string) => voidclassNamestringlayoutIdstringDefault "segmented-indicator"
size"sm" | "md" | "lg"Default "md"
The control uses radiogroup semantics with arrow-key, Home, and End navigation.
Motion and interaction
Each export keeps the same tactile feel, but the default presentation is now much more compact and toolbar-like.
Button, IconButton, and ButtonGroupItems all default to muted text that darkens on hover, which better matches compact shadcn-style controls.
The ButtonGroup wrapper uses the exported buttonGroupVariants CVA recipe, while existing motion-powered controls keep their ripple and shared-hover behavior.
Ripple feedback can now be turned off per surface, which is useful when you want a quieter desktop toolbar feel.
SegmentedControl keeps motion focused on selection changes rather than entrance effects, so the control feels faster and less oversized.
Registry bundle
Install the exact registry entry shown on the right when you want the component file and its declared runtime dependencies together.
Dependencies: @base-ui/react, motion, class-variance-authority.