| import type { CSSProperties } from 'react' |
| import React from 'react' |
| import { type VariantProps, cva } from 'class-variance-authority' |
| import Spinner from '../spinner' |
| import classNames from '@/utils/classnames' |
|
|
| const buttonVariants = cva( |
| 'btn disabled:btn-disabled', |
| { |
| variants: { |
| variant: { |
| 'primary': 'btn-primary', |
| 'warning': 'btn-warning', |
| 'secondary': 'btn-secondary', |
| 'secondary-accent': 'btn-secondary-accent', |
| 'ghost': 'btn-ghost', |
| 'ghost-accent': 'btn-ghost-accent', |
| 'tertiary': 'btn-tertiary', |
| }, |
| size: { |
| small: 'btn-small', |
| medium: 'btn-medium', |
| large: 'btn-large', |
| }, |
| }, |
| defaultVariants: { |
| variant: 'secondary', |
| size: 'medium', |
| }, |
| }, |
| ) |
|
|
| export type ButtonProps = { |
| destructive?: boolean |
| loading?: boolean |
| styleCss?: CSSProperties |
| } & React.ButtonHTMLAttributes<HTMLButtonElement> & VariantProps<typeof buttonVariants> |
|
|
| const Button = React.forwardRef<HTMLButtonElement, ButtonProps>( |
| ({ className, variant, size, destructive, loading, styleCss, children, ...props }, ref) => { |
| return ( |
| <button |
| type='button' |
| className={classNames( |
| buttonVariants({ variant, size, className }), |
| destructive && 'btn-destructive', |
| )} |
| ref={ref} |
| style={styleCss} |
| {...props} |
| > |
| {children} |
| {loading && <Spinner loading={loading} className='!text-white !h-3 !w-3 !border-2 !ml-1' />} |
| </button> |
| ) |
| }, |
| ) |
| Button.displayName = 'Button' |
|
|
| export default Button |
| export { Button, buttonVariants } |
|
|