nyk
feat(refactor): ready for manual QA after main sync (#274)
b6ecafa unverified
import * as React from 'react'
import { Slot } from '@radix-ui/react-slot'
import { cva, type VariantProps } from 'class-variance-authority'
import { cn } from '@/lib/utils'
const buttonVariants = cva(
'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all duration-200 ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 select-none [&_svg]:pointer-events-none [&_svg]:shrink-0',
{
variants: {
variant: {
default: 'bg-primary text-primary-foreground hover:bg-primary/90',
secondary: 'bg-secondary text-muted-foreground hover:bg-muted',
ghost: 'text-muted-foreground hover:text-foreground hover:bg-secondary',
outline:
'border border-border text-muted-foreground hover:text-foreground hover:bg-secondary',
destructive:
'text-red-400 bg-red-500/10 border border-red-500/20 hover:bg-red-500/20',
success:
'bg-green-500/20 text-green-400 border border-green-500/30 hover:bg-green-500/30',
link: 'text-primary underline-offset-4 hover:underline',
},
size: {
xs: 'h-7 px-2 text-xs rounded',
sm: 'h-8 px-3 text-xs',
md: 'h-9 px-4 text-sm',
lg: 'h-10 px-6 text-sm',
'icon-xs': 'h-7 w-7',
'icon-sm': 'h-8 w-8',
icon: 'h-9 w-9',
'icon-lg': 'h-10 w-10',
},
},
defaultVariants: {
variant: 'default',
size: 'md',
},
}
)
interface ButtonProps
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
VariantProps<typeof buttonVariants> {
asChild?: boolean
}
const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
({ className, variant, size, asChild = false, ...props }, ref) => {
const Comp = asChild ? Slot : 'button'
return (
<Comp
className={cn(buttonVariants({ variant, size, className }))}
ref={ref}
{...props}
/>
)
}
)
Button.displayName = 'Button'
export { Button, buttonVariants }
export type { ButtonProps }