Button Component
The Button component is a versatile UI element that provides multiple variants and sizes for different use cases.
Installation
pnpm dlx shadcn@latest add https://ui.vllnt.com/r/button.jsonbash
Usage
import { Button } from '@vllnt/ui'
export function ButtonExample() {
return (
<div className="space-y-6">
<div className="flex gap-2">
<Button variant="default">Default</Button>
<Button variant="secondary">Secondary</Button>
<Button variant="destructive">Destructive</Button>
<Button variant="outline">Outline</Button>
<Button variant="ghost">Ghost</Button>
<Button variant="link">Link</Button>
</div>
<div className="flex gap-2 items-center">
<Button size="sm">Small</Button>
<Button size="default">Default</Button>
<Button size="lg">Large</Button>
<Button size="icon">🚀</Button>
</div>
</div>
)
}tsx
Code
import { forwardRef } from 'react'
import { cva, type VariantProps } from 'class-variance-authority'
import { Slot } from '@radix-ui/react-slot'
import { cn } from '../../lib/utils'
const buttonVariants = cva(
'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',
{
defaultVariants: {
size: 'default',
variant: 'default',
},
variants: {
size: {
default: 'h-10 px-4 py-2',
icon: 'h-10 w-10',
lg: 'h-11 rounded-md px-8',
sm: 'h-9 rounded-md px-3',
},
variant: {
default: 'bg-primary text-primary-foreground hover:bg-primary/90',
destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',
ghost: 'hover:bg-accent hover:text-accent-foreground',
link: 'text-primary underline-offset-4 hover:underline',
outline: 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',
secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
},
},
},
)
export type ButtonProps = {
asChild?: boolean
} & React.ButtonHTMLAttributes<HTMLButtonElement> &
VariantProps<typeof buttonVariants>
const Button = forwardRef<HTMLButtonElement, ButtonProps>(
({ asChild = false, className, size, variant, ...props }, reference) => {
const Comp = asChild ? Slot : 'button'
return (
<Comp
className={cn(buttonVariants({ className, size, variant }))}
ref={reference}
{...props}
/>
)
},
)
Button.displayName = 'Button'
export { Button, buttonVariants }
typescript