Button

The primary interactive element. Six production-ready variants and three sizes — all styled exclusively with CSS custom properties, so they update automatically when tokens change.

Variants


Sizes


Disabled

import { Button } from '@/components/Button';

// Variants
<Button variant="primary">Primary</Button>
<Button variant="outline">Outline</Button>
<Button variant="dark">Dark</Button>
<Button variant="teal">Teal</Button>
<Button variant="cobalt">Cobalt</Button>
<Button variant="marigold">Marigold</Button>

// Sizes
<Button size="sm">Small</Button>
<Button size="md">Medium</Button>
<Button size="lg">Large</Button>

// Disabled
<Button variant="primary" disabled>Disabled</Button>

// Full width
<Button variant="primary" fullWidth>Full Width</Button>

// With icons
<Button variant="primary" leftIcon={<ArrowIcon />}>
  Continue
</Button>
PropTypeDefaultDescription
variant'primary' | 'outline' | 'dark' | 'teal' | 'cobalt' | 'marigold''primary'Controls the visual color treatment of the button.
size'sm' | 'md' | 'lg''md'Sets the height and horizontal padding. sm = 36px, md = 44px, lg = 52px.
childrenReact.ReactNodeThe button label. Required.
fullWidthbooleanfalseStretches the button to fill its container width.
disabledbooleanfalseDisables interaction and reduces opacity to 0.4. Sets aria-disabled.
leftIconReact.ReactNodeIcon or element rendered to the left of the label.
rightIconReact.ReactNodeIcon or element rendered to the right of the label.
type'button' | 'submit' | 'reset''button'Native HTML button type attribute.
classNamestringAdditional CSS class names merged into the element.