Button
Client component built with CVA variants and optional permission gating.
Interactive demo
Options
Interactive
<Button variant="primary" size="default"> Click me </Button>
All variants (default size)
Import
import { Button, buttonVariants } from '@sumx/ui';Basic usage
<Button variant="primary" size="default" onClick={save}>
Save
</Button>
<Button variant="outline" size="sm">
Cancel
</Button>Variants & sizes
variant | Appearance |
|---|---|
primary | Filled brand (default) |
white | White surface, zinc border |
outline | Primary border/text |
destructive | Red destructive |
ghost | Minimal hover |
size | Height / padding |
|---|---|
default | h-10 |
sm | h-8 |
md | h-9 |
lg | h-11, min width 148px |
Use buttonVariants({ variant, size, className }) when you need styles on a non-<button> element (e.g. asChild).
asChild
Renders Radix Slot so the child receives button styles:
<Button asChild variant="outline">
<a href="/reports">Reports</a>
</Button>Permission props
| Prop | Type | Default | Behavior |
|---|---|---|---|
permission | string[] | — | Resource keys checked via PermissionProvider |
permissionMode | 'hide' | 'disable' | 'hide' | Hide when denied, or show disabled |
<Button permission={['invoice.create']} permissionMode="hide">
New invoice
</Button>
<Button permission={['invoice.delete']} permissionMode="disable">
Delete
</Button>Omit permission or pass ['allow'] to always render (same as other gated components).
Props
Extends React.ButtonHTMLAttributes<HTMLButtonElement> plus CVA variant props:
variant,size,className,disabled,asChildpermission,permissionMode
Portal pattern
Use for actions that must respect ERP permissions without duplicating hasPermission checks in every screen.