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 で上書き@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> を適用します。