🎨
Tailwind CSS 4にはドキュメントにないテーマカラーの設定がある
デザインシステムのセマンティックトークン
デザインシステムをTailwind CSS 4で実装する時、セマンティックトークンを@themeに当てはめていくときに悩むかもしれません。具体的な例はこんな感じです。
@layer base {
:root {
/* primaryという色が3種類ある */
--text-primary: var(--blue-100);
--border-primary: var(--blue-90);
--bg-primary: var(--blue-80);
}
}
ドキュメントの通り、--color-*を設定していくと、
@theme {
--color-text-primary: var(--text-primary);
--color-border-primary: var(--border-primary);
--color-bg-primary: var(--bg-primary);
}
こうなり、実際この色を使って実装する時には、
text-text-primaryborder-border-primarybg-bg-primary
といかにも納得いかないクラスになってしまいます。名前を工夫したつもりで--color-b-primaryとすると今度はborder-bottom-colorを意味するborder-b-*と衝突してしまい、うまくいきません。
text-primary border-primary bg-primary を使いたいですよね?
@themeの隠し仕様
結論、--[type]-color-* を使うことで解決します。
@theme {
--text-color-primary: var(--text-primary);
--border-color-primary: var(--border-primary);
/* --bg-color-* ではないことに注意 */
--background-color-primary: var(--bg-primary);
}
これで、text-primary border-primary bg-primary クラスが使えるようになります。
筆者が調べた限り、なぜかv4.1のドキュメントには載っておらず、リポジトリのDiscussion[1]で発見しました。重要な仕様だと思うのでTheme variablesに載せておいてほしいですね。
例えばbackground-colorの実際の実装は、この辺りです。
過去はtailwind.config.jsで可能だった
Tailwind CSS 3ではthemeで設定する方法がドキュメントに載っていました。
/** @type {import('tailwindcss').Config} */
module.exports = {
theme: {
extend: {
textColor: {
primary: 'var(--text-primary)'
},
borderColor: {
primary: 'var(--border-primary)'
},
backgroundColor: {
primary: 'var(--bg-primary)'
}
}
}
};
-
[v4] How to extend or replace colors in certain utilities? ↩︎
Discussion