๋กœ๊ณ ๋กœ๊ณ 

cva(class-variance-authority)

2025๋…„ 3์›” 13์ผ

cva๋Š” class-variance-authority์˜ ์•ฝ์ž์ด๋ฉฐ, Tailwind CSS ์‚ฌ์šฉ์ž๋“ค์ด ๋™์  ํด๋ž˜์Šค ์กฐํ•ฉ์„ ๊น”๋”ํ•˜๊ณ  ํƒ€์ž… ์•ˆ์ „ํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์ฃผ๋กœ ๋ฒ„ํŠผ, ๋ฑƒ์ง€, ์นด๋“œ ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ์—์„œ variant, size, disabled ๊ฐ™์€ **์†์„ฑ(variant)**์— ๋”ฐ๋ผ className์„ ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์„ฑ

ย 

ย 

์žฅ์ 

  • ํƒ€์ž… ์•ˆ์ „
    • ์ž˜๋ชป๋œ ๊ฐ’์„ ๋„ฃ์œผ๋ฉด TypeScript ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์คŒ
  • ์ค‘๋ณต ์ œ๊ฑฐ
    • base๋ฅผ ๊ธฐ์ค€์œผ๋กœ variant, size๋ณ„๋กœ ์ถ”๊ฐ€ ์Šคํƒ€์ผ์„ ์ž…ํžˆ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต์ ์ธ ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Œ.
  • ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›€
    • ์ „์ฒด์ ์ธ ์Šคํƒ€์ผ์„ ๋ฐ”๊ฟ€๋•Œ๋„ base ์Šคํƒ€์ผ์„ ์ˆ˜์ •ํ•˜๋ฉด ๋˜๊ณ  ํŠน์ • variant๋‚˜ size๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ๋„ ์‰ฌ์›€

ย 

์„ค์น˜

npm install class-variance-authority

ย 

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

import { cva } from "class-variance-authority";

const button = cva("px-4 py-2 font-semibold rounded", {
  variants: {
    variant: {
      primary: "bg-blue-500 text-white",
      secondary: "bg-gray-300 text-black",
    },
    size: {
      sm: "text-sm",
      md: "text-md",
      lg: "text-lg",
    },
  },
  defaultVariants: {
    variant: "primary",
    size: "md",
  },
});

ย