์ฝ์ ํ๋ก์ ํธ์์๋ Tailwind CSS๋ฅผ ํ์ฉํด ๊ณตํต ์ปดํฌ๋ํธ๋ฅผ ์คํ์ผ๋งํ๋ฉฐ, twMerge, clsx, ๊ทธ๋ฆฌ๊ณ cva๋ฅผ ์กฐํฉํ์ฌ variant ๊ธฐ๋ฐ ์คํ์ผ๋ง๊ณผ ํด๋์ค ์ค๋ณต ์ ๊ฑฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์๋ค. ์ด ์ค twMerge๋ Tailwind ํด๋์ค ๊ฐ ์ถฉ๋์ ๊ฐ์งํ๊ณ , ์ฐ์ ์์์ ๋ฐ๋ผ ๊ฐ์ฅ ๋ง์ง๋ง์ ์ ์๋ ํด๋์ค๋ฅผ ๋ณํฉํด์ฃผ๋ ์ ํธ๋ฆฌํฐ๋ก, ๋คํฌ๋ชจ๋ ๋ฐ ๋ฐ์ํ ํด๋์ค ๋ฑ ๋ค์ํ ๋ณํ์ด ๋ง์ Tailwind ํ๊ฒฝ์์ ์ ์ฉํ๊ฒ ํ์ฉ๋๋ค.
ํด๋น ํ๋ก์ ํธ์์๋ ๋์์ธ ์์คํ ์ ๊ธฐ๋ฐํด ๋ค์๊ณผ ๊ฐ์ด text-head1, text-head2 ๋ฑ์ ์ปค์คํ ํ์ดํฌ๊ทธ๋ํผ ์ ํธ ํด๋์ค๋ฅผ ์ ์ํ์ฌ ์ฌ์ฉํ๊ณ ์๋ค.
--text-head1--line-height: 52px;
--text-head1--letter-spacing: -0.6px;
--text-head1--font-weight: 800;
--text-head2: 36px;
--text-head2--line-height: 46px;
--text-head2--letter-spacing: -0.6px;
--text-head2--font-weight: 800;
--text-head3: 36px;
--text-head3--line-height: 46px;
--text-head3--letter-spacing: -0.6px;
--text-head3--font-weight: 800;
๊ทธ๋ฌ๋ ์ด์ฒ๋ผ text- ์ ๋์ฌ๋ฅผ ์ฌ์ฉํ๋ ํด๋์ค๋ค์ Tailwind์ ๊ธฐ๋ณธ ํ ์คํธ ์์ ํด๋์ค(text-white, text-gray-700 ๋ฑ)์ ๋์ผํ ์ ๋์ฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, twMerge๋ ์ด๋ฅผ ๋์ผํ class group์ผ๋ก ์ธ์ํ๋ค. ์ด๋ก ์ธํด ๋ณํฉ ์ ๋ง์ง๋ง์ผ๋ก ์์ฑ๋ ํด๋์ค๋ง ๋จ๊ธฐ๊ณ , ๋๋จธ์ง ํด๋์ค๋ ์ ๊ฑฐ๋๋ ์ถฉ๋ ํ์์ด ๋ฐ์ํ๋ค.
<p className="text-white text-head2">hello world</p> // text-head2๋ก ๋ณํฉ
์ด ๋ twMerge์์ ์ ๊ณตํ๋ extendTailwindMerge API๋ฅผ ์ฌ์ฉํ๋ฉด twMerge์ ๋ณํฉ ๊ท์น ํ์ฅ์ ํตํ์ฌ ์ปค์คํ ํ์ดํฌ๊ทธ๋ํผ ํด๋์ค์ ๊ธฐ๋ณธ ํ ์คํธ ์ปฌ๋ฌ ํด๋์ค๊ฐ ์์ ์ ์ผ๋ก ๊ณต์กดํ ์ ์๊ฒ ํ๋ค.
์๋์ ๊ฐ์ด ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ ์ปค์คํ text-* ํด๋์ค๋ค์ ๋ช ์์ ์ผ๋ก font-size class group์ ๋ฑ๋กํ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
import { ClassValue, clsx } from 'clsx'
import { extendTailwindMerge } from 'tailwind-merge'
const customTwMerge = extendTailwindMerge({
extend: {
classGroups: {
'font-size': [
'text-head1',
'text-head2',
'text-head3',
'text-head4',
'text-head5',
'text-head6',
'text-subhead1',
'text-subhead2',
'text-subhead3',
'text-body1',
'text-body2',
'text-caption1',
],
},
},
})
export function cn(...inputs: ClassValue[]) {
return customTwMerge(clsx(inputs))
}