Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import type { CSSProperties } from 'react'
  2. import React from 'react'
  3. import { type VariantProps, cva } from 'class-variance-authority'
  4. import Spinner from '../spinner'
  5. import classNames from '@/utils/classnames'
  6. const buttonVariants = cva(
  7. 'btn disabled:btn-disabled',
  8. {
  9. variants: {
  10. variant: {
  11. 'primary': 'btn-primary',
  12. 'warning': 'btn-warning',
  13. 'secondary': 'btn-secondary',
  14. 'secondary-accent': 'btn-secondary-accent',
  15. 'ghost': 'btn-ghost',
  16. 'ghost-accent': 'btn-ghost-accent',
  17. 'tertiary': 'btn-tertiary',
  18. },
  19. size: {
  20. small: 'btn-small',
  21. medium: 'btn-medium',
  22. large: 'btn-large',
  23. },
  24. },
  25. defaultVariants: {
  26. variant: 'secondary',
  27. size: 'medium',
  28. },
  29. },
  30. )
  31. export type ButtonProps = {
  32. destructive?: boolean
  33. loading?: boolean
  34. styleCss?: CSSProperties
  35. spinnerClassName?: string
  36. ref?: React.Ref<HTMLButtonElement>
  37. } & React.ButtonHTMLAttributes<HTMLButtonElement> & VariantProps<typeof buttonVariants>
  38. const Button = ({ className, variant, size, destructive, loading, styleCss, children, spinnerClassName, ref, ...props }: ButtonProps) => {
  39. return (
  40. <button
  41. type='button'
  42. className={classNames(
  43. buttonVariants({ variant, size, className }),
  44. destructive && 'btn-destructive',
  45. )}
  46. ref={ref}
  47. style={styleCss}
  48. {...props}
  49. >
  50. {children}
  51. {loading && <Spinner loading={loading} className={classNames('!ml-1 !h-3 !w-3 !border-2 !text-white', spinnerClassName)} />}
  52. </button>
  53. )
  54. }
  55. Button.displayName = 'Button'
  56. export default Button
  57. export { Button, buttonVariants }