Skip to main content
The Button component provides a flexible, accessible button with multiple visual variants and sizes.

Installation

npx shadcn@latest add @eo-n/button

Usage

import { Button } from "@/components/ui/button";

export default function Example() {
  return <Button>Click me</Button>;
}

Examples

Variants

Button comes with multiple visual variants:
<Button variant="default">Primary</Button>

Sizes

<Button size="sm">Small</Button>
<Button size="default">Default</Button>
<Button size="lg">Large</Button>

Icon Button

import { Search } from "lucide-react";

<Button size="icon">
  <Search />
</Button>
<Button size="icon-sm">
  <Search />
</Button>
<Button size="icon-lg">
  <Search />
</Button>

With Icon

import { Mail } from "lucide-react";

<Button>
  <Mail />
  Login with Email
</Button>

Loading State

import { Loader2 } from "lucide-react";

<Button disabled>
  <Loader2 className="animate-spin" />
  Please wait
</Button>

Active State

<Button active>Active Button</Button>

API Reference

Button

Extends all props from @base-ui/react Button component.
variant
string
default:"default"
The visual style of the button.Options: default | destructive | outline | secondary | ghost | link
size
string
default:"default"
The size of the button.Options: default | sm | lg | icon | icon-sm | icon-lg
active
boolean
default:"false"
Whether the button is in an active state.
disabled
boolean
Whether the button is disabled.
className
string
Additional CSS classes to apply to the button.

TypeScript

import { Button as ButtonPrimitive } from "@base-ui/react";
import { VariantProps } from "class-variance-authority";

type ButtonVariants = VariantProps<typeof buttonVariants>;

type ButtonProps = React.ComponentProps<typeof ButtonPrimitive> &
  ButtonVariants & {
    active?: boolean;
  };

Build docs developers (and LLMs) love