Components/Button

Core component

Button

The primary action surface. Ink border + hard offset shadow; lifts on hover, slams into the page on press. Use primary for the main action, accent for marketing CTAs, secondary for low emphasis.

Interactive6 variants3 sizesSnap motionDark mode ✓
components/core/Button.jsx
Variants
6 variants — hover & press each one
Sizes
sm · md (default) · lg
States
Default · Disabled · Block
Icon slots
iconLeft · iconRight · both
Do / Don't
✓ Do
✕ Don't
Props
PropTypeDefaultDescription
variant"primary"|"accent"|"pink"|"secondary"|"dark"|"ghost""primary"Visual treatment. primary = violet, accent = lime, ghost = dashed transparent.
size"sm"|"md"|"lg""md"Affects padding, font-size, and shadow offset.
blockbooleanfalseFull-width block button. Sets display: flex and width: 100%.
disabledbooleanfalseMutes to 45% opacity, disables all pointer events and motion.
iconLeftReactNodenullElement rendered before label — use a 16px SVG icon.
iconRightReactNodenullElement rendered after label — use a 10px chevron SVG.
childrenReactNodeButton label text.
styleCSSProperties{}Merged onto the root element. Use sparingly — prefer variant/size.
...restButtonHTMLAttributesPassed to the native <button> (onClick, type, aria-*, etc.).
Usage
import { Button } from "components/core/Button";

// Primary — main action
<Button variant="primary">Save campaign</Button>

// With icon + size
<Button variant="accent" size="lg"
  iconRight={<ChevronRight />}>
  Get started
</Button>

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

// Full width
<Button variant="accent" block>Create account</Button>