Tailwind v3 + v4
Tailwind CSS v3 / v4 듀얼 지원 아키텍처입니다.
컴포넌트 코드는 단일 소스를 유지하고, 테마 파일이 버전 차이를 흡수합니다.
설정 방법은 Installation 페이지를 참고하세요.
Architecture
figma-tokens.json → variables.css가 유일한 값 소스입니다. v3-preset.js와 v4-theme.css는 variables.css를 참조하는 매핑 레이어입니다.
v3 동작 방식
- JS 프리셋 (
theme.extend) - CSS 변수를
var()로 참조 - plugins으로 커스텀 유틸리티 정의
- 시맨틱 컬러
bg-primary/50지원 (RGB 채널 변수)
v4 동작 방식
- CSS
@theme+@utility - var() 참조 + HEX 폴백 (동일 변수명은 캐스케이드로 덮어쓰기)
color-mix()런타임 변환bg-primary/50 지원
Sync Logic
Figma 토큰 → sync-tokens 실행 시, v3/v4 테마 파일이 생성되는 2가지 패턴
var() 참조 (변수명이 다른 경우)
테마 변수명과 CSS 변수명이 다를 경우, var()로 직접 참조합니다.
--color-primary-text--color-primary-foregroundtext-primary-foregroundCSS 캐스케이드 (동일 변수명)
동일 변수명은 var() 자기 참조가 불가합니다. sync-tokens가 v4-theme.css의 @theme에 HEX 폴백 값을 생성하고, variables.css (unlayered)가 @layer theme보다 항상 우선되는 캐스케이드로 덮어씁니다. 유틸리티는 var() 참조를 사용하므로, 다크 모드 변수 전환이 자동 반영됩니다.
var(--color-primary-text)#15A0AC → unlayered override@utility { ... var(...) }이 동기화 작업들은 sync-tokens CLI로 자동 생성됩니다. v3-preset.js / v4-theme.css를 직접 편집할 필요가 없습니다.
Naming Differences
v3과 v4는 테마 변수 정의 방식이 다릅니다. 컴포넌트가 사용하는 유틸리티 클래스는 동일합니다.
text-mdfontSize: { md: ['var(--font-size-md)', ...] }--text-md: var(--font-size-md)bg-primarycolors: { primary: 'var(--color-primary)' }--color-primary: #15A0AC (cascade)rounded-mdborderRadius: { md: 'var(--radius-md)' }--radius-md: 6px (cascade)text-foregroundcolors: { foreground: 'var(--color-text)' }--color-foreground: var(--color-text)shadow-smboxShadow: { sm: 'var(--shadow-sm)' }--shadow-sm: 0 1px 3px ... (cascade)border-bordercolors: { border: 'var(--color-border)' }--color-border: #E4E4E7 (cascade)icon-xs ~ xladdUtilities plugin@utility { width/height: var(...) }v4의 @theme 네임스페이스에 없는 항목(duration, scale, z-index, icon-size 등)은 @utility으로 개별 정의합니다. v3에서는 동등한 기능을 plugins의 addUtilities()으로 구현합니다.
v4에서는 *-foreground 별칭도 사용 가능합니다 (예: text-muted-foreground = text-text-muted). shadcn/ui 등의 에코시스템과 호환됩니다.
Custom Utilities
Tailwind 표준 테마에 없는 항목을 v3/v4 각각의 방식으로 커스텀 유틸리티로 정의합니다.
Duration
duration-micro, duration-fast, duration-normal트랜지션 지속 시간
Scale
scale-pressed버튼 클릭 시 축소 애니메이션
Icon Sizes
icon-xs ~ icon-xl5단계 아이콘 크기
Focus Ring
focus-ring포커스 링 유틸리티
Z-index
z-modal, z-tooltip, z-toast명명된 Z-인덱스 레이어
Animation
animate-checkbox-enter, animate-accordion-down컴포넌트 애니메이션
Dark Mode
다크 모드는 themes/dark.css의 .dark 블록으로 완전히 관리됩니다. v3/v4 테마 파일에 다크 모드 정의가 필요 없습니다.
:root.darkv3
사용자의 tailwind.config.js에 darkMode: ['class']를 설정합니다.v3-preset.js는 var()로 참조하므로,.dark 클래스로 변수가 전환되면 자동으로 반영됩니다.
v4
variables.css (unlayered)가 @theme (theme layer)를 캐스케이드로 항상 덮어씁니다. 유틸리티는 var()를 사용하므로, .dark 변수 전환이 자동 반영됩니다.v4-theme.css에 .dark 블록은 필요 없습니다.
Opacity Modifier
v3/v4 모두 bg-primary/50 같은 opacity modifier를 지원합니다. v3은 RGB 채널 변수, v4는 color-mix()로 구현됩니다.
v3
RGB 채널 변수로 완전 지원bg-primarybg-primary/50text-foreground/80border-border/50v4
color-mix()로 완전 지원bg-primarybg-primary/50text-foreground/80border-border/50v3에서도 bg-primary/50 같은 opacity modifier를 지원합니다.RGB 채널 변수(--color-*-rgb)를 자동 생성하고 <alpha-value>를 적용합니다.