Button

A small, dependable action primitive for app interfaces. Use one install command and compose default, secondary, outline, ghost, white, destructive, icon, loading, and disabled states from the same Button API.

Loading preview...

Examples

Practical examples and common states for the same installable component.

Secondary

Quiet supporting action that still reads as clickable.

examples/button-secondary.tsx
import { Button } from "@/components/wensity/button";
export function ButtonSecondary() {
return <Button variant="secondary">Save draft</Button>;
}

White

Bright CTA reserved for dark heroes or one-action moments.

examples/button-white.tsx
import { IconArrowRight } from "@tabler/icons-react";
import { Button } from "@/components/wensity/button";
export function ButtonWhite() {
return (
<Button variant="white" rightIcon={<IconArrowRight />} rightIconMotion="arrow">
Launch demo
</Button>
);
}

Destructive

Danger action for deletion or irreversible changes.

examples/button-destructive.tsx
import { IconTrash } from "@tabler/icons-react";
import { Button } from "@/components/wensity/button";
export function ButtonDestructive() {
return (
<Button variant="destructive" leftIcon={<IconTrash />} leftIconMotion="trash">
Delete project
</Button>
);
}

Icons

Optional left and right icon slots without extra wrappers.

examples/button-icons.tsx
import { IconDownload, IconMail } from "@tabler/icons-react";
import { Button } from "@/components/wensity/button";
export function ButtonIcons() {
return (
<div className="flex items-center gap-3">
<Button leftIcon={<IconMail />} leftIconMotion="mail">
Email team
</Button>
<Button variant="outline" rightIcon={<IconDownload />} rightIconMotion="download">
Download
</Button>
</div>
);
}

Button Group

Fuse related actions into one segmented control with a primary action, dividers, and an overflow menu.

examples/button-button-group.tsx
"use client";
import {
IconChevronLeft,
IconCopy,
IconDots,
IconFileExport,
IconHistory,
IconShare3,
IconTrash,
} from "@tabler/icons-react";
import {
ButtonGroup,
ButtonGroupItem,
ButtonGroupMenu,
ButtonGroupMenuContent,
ButtonGroupMenuItem,
ButtonGroupMenuLabel,
ButtonGroupMenuSeparator,
ButtonGroupMenuTrigger,
ButtonGroupSeparator,
} from "@/components/wensity/button";
export function DraftActions() {
return (
<ButtonGroup aria-label="Draft actions">
<ButtonGroupItem size="icon" aria-label="Previous draft">
<IconChevronLeft />
</ButtonGroupItem>
<ButtonGroupSeparator />
<ButtonGroupItem>Save draft</ButtonGroupItem>
<ButtonGroupItem>Publish</ButtonGroupItem>
<ButtonGroupSeparator />
<ButtonGroupItem>Share</ButtonGroupItem>
<ButtonGroupMenu>
<ButtonGroupMenuTrigger size="icon" aria-label="More draft actions">
<IconDots />
</ButtonGroupMenuTrigger>
<ButtonGroupMenuContent align="end">
<ButtonGroupMenuLabel>Draft</ButtonGroupMenuLabel>
<ButtonGroupMenuItem icon={<IconCopy />} shortcut="Cmd+D">
Duplicate
</ButtonGroupMenuItem>
<ButtonGroupMenuItem icon={<IconHistory />}>
Version history
</ButtonGroupMenuItem>
<ButtonGroupMenuItem icon={<IconFileExport />}>
Export as PDF
</ButtonGroupMenuItem>
<ButtonGroupMenuSeparator />
<ButtonGroupMenuItem icon={<IconShare3 />}>
Copy invite link
</ButtonGroupMenuItem>
<ButtonGroupMenuSeparator />
<ButtonGroupMenuItem destructive icon={<IconTrash />}>
Delete draft
</ButtonGroupMenuItem>
</ButtonGroupMenuContent>
</ButtonGroupMenu>
</ButtonGroup>
);
}

Loading

Built-in loading state disables the action and keeps width stable.

examples/button-loading.tsx
import { Button } from "@/components/wensity/button";
export function ButtonLoading() {
return <Button loading>Saving changes</Button>;
}

Ghost

Toolbar and dense UI action with minimal chrome.

examples/button-ghost.tsx
import { Button } from "@/components/wensity/button";
export function ButtonGhost() {
return <Button variant="ghost">Cancel</Button>;
}

Disabled

Disabled buttons keep layout stable while clearly dropping emphasis.

examples/button-disabled.tsx
import { Button } from "@/components/wensity/button";
export function ButtonDisabled() {
return (
<div className="flex items-center gap-3">
<Button disabled>Disabled</Button>
<Button disabled variant="outline">
Disabled
</Button>
</div>
);
}