[React] shadcn/ui를 본격적으로 사용해보자
📚 본격적으로 shadcn/ui + Tailwind CSS 조합 써보기!!
본격적으로 프로젝트에서 shadcn/ui를 도입했는데, 생각보다 신경 쓸 게 많다..ㅜㅠㅜ 이번 글에서는 내가 지금 겪고 있는 문제들과 해결법, 그리고 관련된 이론들을 다뤄보려고 한다!!
1. Tailwind CSS에 커스텀 디자인 토큰 적용하기
Tailwind 설정하기
tailwind.config.ts에서 기본적으로 colors, borderRadius 등을 확장할 수 있다!
import type { Config } from 'tailwindcss';
const config: Config = {
theme: {
extend: {
colors: {
primary: {
DEFAULT: 'var(--primary)',
light: 'var(--primary-light)',
hover: 'var(--primary-hover)',
...
},
},
borderRadius: {
lg: 'var(--radius)',
md: 'calc(var(--radius) - 2px)',
sm: 'calc(var(--radius) - 4px)',
}, // 기본적으로 shadcn/ui에서 제공
},
},
plugins: [],
};
export default config;
이렇게 하면 text-primary, bg-primary-light 같은 Tailwind 클래스에서 우리가 정의한 색상을 가져다 쓸 수 있다! border-radius도 변수로 관리 가능!
2. shadcn/ui와 Tailwind 변수를 함께 쓰기
shadcn/ui는 기본적으로 Tailwind 기반이지만, 커스텀 스타일을 적용하려면 variant를 활용해야 한다.
Button 컴포넌트 예제
import { cn } from "@/lib/utils";
import { cva, VariantProps } from "class-variance-authority";
const buttonVariants = cva(
"inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus:outline-none",
{
variants: {
variant: {
// 디자인 토큰을 활용하여 버튼 스타일을 커스텀함
default: '
bg-primary
text-white shadow
hover:bg-primary-hover
',
outline: "border border-primary text-primary hover:bg-primary/10",
},
size: {
sm: "h-8 px-3 text-xs",
md: "h-10 px-4 text-sm",
lg: "h-12 px-6 text-base",
},
},
defaultVariants: {
variant: "default",
size: "md",
},
}
);
export function Button({ className, variant, size, ...props }) {
return <button className={cn(buttonVariants({ variant, size }), className)} {...props} />;
}
bg-primary를 쓰면 Tailwind에서 우리가 설정한 var(--primary) 값이 들어가게 된다!
3. 컴포넌트 import 하기
우선 잘 적용되는지만 확인하기 위해 기본 페이지에서 import만 하여 확인해보았다.
import { Button } from '@/components/next-button/button';
export default function Home() {
return (
<Button>이븐하게</Button>
)
}
4. HSL, HEX 오류 해결하기
근데 스타일 적용이 안됨… ㅜㅜ 변수도 잘 설정해놨고, style에도 변수명에 맞게 잘 적었는데..
알고 보니 나는 프로젝트 내에서 미리 설정한 DEFAULT: 'var(--primary)', 가 도입을 하면서 DEFAULT: 'hsl(var(--primary))',로 바꼈던 것.. 처음에 shadcn/ui를 설치하고 컴포넌트를 사용하게 되면, 미리 지정해둔 tailwind.config.ts 에 있는 일부 변수가 바뀔 수도 있다는 사실을 잘 알아두자.. Tailwind는 기본적으로 HSL을 지원하지만, CSS 변수로 HEX 값을 넣으면 오류가 난다는 사실도…! 😭
DEFAULT: 'hsl(var(--primary))', -> DEFAULT: 'var(--primary)',
아주 적용이 잘 되었다 ㅎㅎ
4. 마무리하며...
변수를 활용하는 부분에서 신경 써야 할 게 많았다..😵💫 하지만 디자인 시스템을 잘 구축해두면 이후 유지보수가 훨씬 편해지니까 미리 정리해두는 게 중요한 듯! 혹시 나랑 비슷한 문제 겪은 사람 있으면 도움 됐으면 좋겠다!! 🙌