img-tw
#tailwind
import { tv } from 'tailwind-variants'

export const buttonVariant = tv({
  variants: {
    color: {
      primary: 'bg-blue-500 hover:bg-blue-700',
      secondary: 'bg-purple-500 hover:bg-purple-700',
      success: 'bg-green-500 hover:bg-green-700',
    },
    size: {
      sm: 'py-1 px-3 text-xs',
      md: 'py-1.5 px-4 text-sm',
      lg: 'py-2 px-6 text-md',
    },
    disabled: {
      true: 'opacity-50 bg-gray-500 pointer-events-none',
    },
  },

  // menampilkan jika kondisi warna "success" & disabled true
  // beberapa kondisi variants
  compoundVariants: [
    {
      color: 'success',
      disabled: true,
      class: 'bg-gray-300 text-gray-700 ',
      // Kamu juga bisa menggunakan "className"
    },
    {
      color: ['primary', 'secondary'],
      disabled: true,
      class: 'text-slate-700 bg-slate-300',
    },
  ],
  // default variants
  defaultVariants: {
    color: 'primary',
    size: 'md',
    disabled: false,
  },
  base: 'font-semibold text-white py-1 px-3 rounded-full active:opacity-80',
  // jika menggunakan slots, base akan ditimpa
  // dan jika kita membuat slot lain, kita dapat menggunakan slot tersebut
  slots: {
    base: 'font-bold font-manrope text-white py-1 px-3 rounded-full active:opacity-80',
    icon: 'w-4 h-4 mr-2',
    label: '',
  },
})

// menimpa gaya komponen tunggal, kita dapat menggunakan seperti ini
/**
  // override color variant
  button({ color: 'secondary', class: 'bg-pink-500 hover:bg-pink-500' });
 */

// overiding slots, we can use like this
/** 
  const card = tv({ 
    slots: { 
      base: 'md:flex bg-slate-100 rounded-xl p-8 md:p-0 dark:bg-gray-900', 
    }
  })
   
  const { base } = card();

  <div className={base({ class: 'bg-purple-100 dark:bg-purple-800' })}></div>
 **/

cara menggunakan

const { base: baseSuccessVariant } = buttonVariant({
  color: 'success',
  size: 'lg',
})
const { base: baseBooleanVariant } = buttonVariant({
  color: 'secondary',
  disabled: true,
  size: 'lg',
})
const { base: baseCompoundVariant } = buttonVariant({
  color: 'success',
  disabled: true,
  size: 'lg',
})
const { base: baseCompount2Color } = buttonVariant({
  color: 'primary',
  disabled: true,
  size: 'lg',
})

export default function Home() {
  return (
    <div className={cn(flexCol.center, 'h-screen')}>
      <p className="text-4xl font-bold font-manrope mb-8">Hallo developer</p>
      <div className={cn(flex.center, 'gap-2')}>
        <button className={baseSuccessVariant()} onClick={() => toast.success('Hallo')}>
          Success variant
        </button>
        <button className={baseBooleanVariant()}>Boolean variant</button>
        <button className={baseCompoundVariant()}>Compound variant</button>
        <button className={baseCompount2Color()}>Compound variant with 2 color</button>
      </div>
    </div>
  )
}