Skip to main content

Button

Buttons help people initiate actions, from sending an email, to sharing a document, to liking a post.

Import

import { Button } from '@md3-react/core';

Basic Usage

Live Editor
<Demo>
  <Button>Click me</Button>
</Demo>
Result
Loading...

Variants

MD3 defines five button variants:

Live Editor
<Demo>
  <div style={{ display: 'flex', gap: '12px', flexWrap: 'wrap' }}>
    <Button variant="filled">Filled</Button>
    <Button variant="outlined">Outlined</Button>
    <Button variant="text">Text</Button>
    <Button variant="elevated">Elevated</Button>
    <Button variant="tonal">Tonal</Button>
  </div>
</Demo>
Result
Loading...

Filled Button

Use filled buttons for high emphasis actions. They contain a solid background color.

Live Editor
<Demo>
  <Button variant="filled">Submit</Button>
</Demo>
Result
Loading...

Outlined Button

Use outlined buttons for medium emphasis. They have a visible border and no background.

Live Editor
<Demo>
  <Button variant="outlined">Cancel</Button>
</Demo>
Result
Loading...

Text Button

Use text buttons for low emphasis actions, often used for less important actions.

Live Editor
<Demo>
  <Button variant="text">Learn more</Button>
</Demo>
Result
Loading...

Elevated Button

Elevated buttons have a shadow and are used when you need visual separation from the background.

Live Editor
<Demo>
  <Button variant="elevated">Add to cart</Button>
</Demo>
Result
Loading...

Tonal Button

Tonal buttons use a secondary container color, providing a middle ground between filled and outlined.

Live Editor
<Demo>
  <Button variant="tonal">Save draft</Button>
</Demo>
Result
Loading...

With Icon

Add an icon before the button text:

Live Editor
<Demo>
  <div style={{ display: 'flex', gap: '12px', flexWrap: 'wrap' }}>
    <Button variant="filled" icon={<Add />}>Add item</Button>
    <Button variant="outlined" icon={<Settings />}>Settings</Button>
    <Button variant="tonal" icon={<Favorite />}>Favorite</Button>
  </div>
</Demo>
Result
Loading...

States

Disabled

Live Editor
<Demo>
  <div style={{ display: 'flex', gap: '12px', flexWrap: 'wrap' }}>
    <Button variant="filled" disabled>Disabled Filled</Button>
    <Button variant="outlined" disabled>Disabled Outlined</Button>
    <Button variant="text" disabled>Disabled Text</Button>
  </div>
</Demo>
Result
Loading...

Full Width

Live Editor
<Demo>
  <Button fullWidth>Full Width Button</Button>
</Demo>
Result
Loading...

Props

PropTypeDefaultDescription
variant'filled' | 'outlined' | 'text' | 'elevated' | 'tonal''filled'Visual style variant
iconReactNode-Icon element to display before text
disabledbooleanfalseDisables the button
fullWidthbooleanfalseMakes button take full container width
childrenReactNode-Button content

Plus all standard <button> HTML attributes.

Accessibility

  • Buttons use semantic <button> elements
  • Disabled state removes from tab order
  • Focus visible styles for keyboard navigation

Design Guidelines

When to use each variant

VariantUse case
FilledPrimary actions, CTAs
OutlinedSecondary actions
TextTertiary actions, navigation
ElevatedActions needing visual prominence on complex backgrounds
TonalActions that need more emphasis than text but less than filled

Spacing

  • Minimum touch target: 48dp
  • Horizontal padding: 24dp (16dp with icon)
  • Button height: 40dp