| 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 } | |