😀
Nuxt UIのprimaryカラーをCSS内で階層指定する方法
Nuxt UIのprimaryカラーをCSS内で階層指定する方法
はじめに
こんにちは。個人開発でNuxt3を使ったWebアプリケーションを開発しているごんです。
この記事では、Nuxt UIのprimaryカラーをCSS内で呼び出す際の課題とその解決方法、そしてTailwindとCSS変数の違いについてまとめています。特にCSS内でprimary-400などの階層を利用する際にハマったので、その備忘録を残します。
課題:CSS内でprimaryの階層を呼び出せない
最初の試行錯誤
細かいCSSの設定が必要だったため、CSS内で--color-primary-400を呼ぼうとしましたが、反映されませんでした。
/* ❌ これは動作しない */
.my-element {
background-color: var(--color-primary-400);
}
Nuxt UIのデフォルトCSS変数
調べてみると、Nuxt UIでは--color-primary(500番相当)のみが提供されていることがわかりました。
/* ✅ これは動作する(500番のみ) */
.my-element {
background-color: var(--color-primary);
}
しかし、これでは400や600など他の階層は使用できませんでした。
解決方法:CSS変数の自前定義
1. CSS変数として階層を定義 + Tailwindユーティリティクラスとの併用
生成AIに相談したところ、必要な階層を自分でCSS変数として定義し、さらに@layer utilitiesを追加することで、CSS内での直接使用とTailwindクラスbg-primary-400の両方が可能になることがわかりました。
:root {
/* Primary: 緑系統 */
--color-primary-50: #f0fdf4;
--color-primary-100: #dcfce7;
--color-primary-200: #bbf7d0;
--color-primary-300: #86efac;
--color-primary-400: #4ade80;
--color-primary-500: #22c55e;
--color-primary-600: #16a34a;
--color-primary-700: #15803d;
--color-primary-800: #166534;
--color-primary-900: #14532d;
}
@layer utilities {
/* Primary */
.bg-primary-400 { background-color: var(--color-primary-400); }
.bg-primary-500 { background-color: var(--color-primary-500); }
.bg-primary-600 { background-color: var(--color-primary-600); }
}
2. CSS内での使用
定義した変数をCSS内で直接使用できます。
/* ✅ 階層を自由に使用可能 */
.my-element {
background-color: var(--color-primary-400);
}
Tailwindクラスとの関係について
NuxtUIの自動クラス生成
ですが、、、@layer utilitiesを手動で定義する必要はありませんでした!!
NuxtUIはapp.config.tsでカラーを定義するだけで、自動的に以下のクラスを生成します:
-
bg-primary-400、bg-secondary-500、bg-accent-600等 -
text-primary-400、border-primary-500等
つまり、Tailwindの標準カラーと同様に、カスタムカラー名でも自動でクラスが使用可能です。
export default defineAppConfig({
ui: {
colors: {
primary: 'green', // Tailwindのgreen色を使用
secondary: 'amber', // Tailwindのamber色を使用
accent: 'purple', // Tailwindのpurple色を使用
gray: 'slate',
},
strategy: 'override'
}
})
nuxt.config.ts でのsafelist設定
export default defineNuxtConfig({
ui: {
global: true,
safelistColors: ['primary', 'secondary', 'accent', 'slate'],
}
})
safelistColorsの重要性:
- TailwindのPurge保護: ビルド時に未使用CSS削除から色クラスを保護
-
動的クラス生成: JavaScriptで動的に生成されるクラス名(
bg-${colorName}-400等)を確実に保持 - NuxtUI内部使用: NuxtUIコンポーネントが内部で使用する色クラスの保護
例:以下のような動的色指定が確実に動作します
<script setup>
const getButtonColor = (type) => `bg-${type}-500` // bg-primary-500等
</script>
<template>
<div :class="getButtonColor('primary')">動的カラー</div>
</template>
<template>
<!-- ✅ 標準Tailwindクラス(緑色) -->
<div class="bg-green-400 text-white">標準の緑色</div>
<!-- ✅ カスタムクラス(primary色) -->
<div class="bg-primary-400 text-white">プライマリ色</div>
<!-- ✅ CSS内でのカスタム変数 -->
<div class="custom-style">カスタムスタイル</div>
</template>
<style>
.custom-style {
background-color: var(--color-primary-400);
border: 2px solid var(--color-secondary-500);
}
</style>
TailwindとCSS変数の違い
| 呼び出し方法 | primary-400 | primary-500 | primary-600 |
|---|---|---|---|
| Tailwindクラス | ✅ bg-primary-400(NuxtUI自動生成) |
✅ bg-primary-500(NuxtUI自動生成) |
✅ bg-primary-600(NuxtUI自動生成) |
| Nuxt UI デフォルトCSS変数 | ❌ 存在しない | ✅ var(--color-primary)
|
❌ 存在しない |
ポイント
-
Tailwindクラス: NuxtUIが
app.config.tsの設定から自動生成(手動定義不要) -
Nuxt UI デフォルト: CSS変数として呼べるのは500番のみ(
--color-primary) - 階層使用: 400や600をCSS内で使いたい場合は、自分で変数を定義する必要がある
まとめ
解決できたこと
- CSS内で
primary-400を直接呼べなかった問題を、自前のCSS変数定義で解決 -
NuxtUIの自動クラス生成機能により、Tailwindクラス(
bg-primary-400等)が自動で使用可能 - テンプレートとCSSの両方で統一されたカラーシステムを構築
学んだポイント
-
Nuxt UIのデフォルト制限: CSS変数は500番(
--color-primary)のみ提供 - 階層使用の要件: 400や600など他の階層を使うには自前のCSS変数定義が必要
- NuxtUIの自動機能: app.config.tsでカラーを定義すれば、Tailwindクラスは自動生成される
- @layer utilitiesは不要: 手動でTailwindクラスを定義する必要はない
- safelistColorsの重要性: 動的クラス生成とPurge保護のため必須設定
- シンプルな解決策: CSS変数定義 + NuxtUIの自動機能 + safelist設定の組み合わせが最適
参考リンク
Discussion