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