生産性を最大化して開発チームが共同作業できる、統合されたオールインワンプラットフォームをお探しですか?
Apidogは、お客様のあらゆる要求に応え、Postmanをはるかに手頃な価格で置き換えます!
ボタン
フロントエンド開発者にとって、見た目が美しく、高性能で、高度にカスタマイズ可能なユーザーインターフェースへの要求はかつてないほど高まっています。開発者は、品質や創造的な制御を犠牲にすることなく、ワークフローを加速できるツールを常に探しています。モノリシックなUIコンポーネントライブラリは何年もコミュニティに貢献してきましたが、開発者の所有権、モジュール性、最新フレームワークとのシームレスな統合を優先する新しいパラダイムが登場しています。HeroUIは、この新しいパラダイムの中にニッチを切り開いています。
HeroUIは単なる別のコンポーネントライブラリではありません。プロジェクトに直接統合できるように設計された、再利用可能なUIコンポーネントの精巧に作られたコレクションです。1 これは、開発者にコードベースに対する究極の制御を与える哲学を支持しています。nodeモジュールから不透明なコンポーネントをインポートする代わりに、HeroUIコマンドラインインターフェース(CLI)を使用して、必要なコンポーネントの実際のソースコードをプロジェクトに追加します。2 この「コピー&ペースト」の進化は、すべてのボタン、カード、ダイアログボックスが独自のアプリケーションの一部となり、特定のニーズに合わせて調整、再スタイル、適応できるようになることを意味します。
React、Tailwind CSS、Next.jsのような巨人の肩の上に構築されたHeroUIは、美しく、アクセシブルで、レスポンシブなユーザーインターフェースを作成するためのビルディングブロックを提供します。速度と特異性の両方を重視する現代の開発者向けに設計されており、厳格なデザインシステムに縛られることのない堅牢な出発点を提供します。この記事では、HeroUIのコア原則の理解、プロジェクトへのインストール、外観と感触のカスタマイズ、そしてその強力なCLIを活用して次世代のWebアプリケーションを構築するための包括的なガイドとして機能します。
パート1:HeroUIを解体する - 哲学とコア機能
インストールと使用に関する技術的な詳細に入る前に、HeroUIの「なぜ」を理解することが重要です。それはどのような問題を解決し、UIツールの混雑した分野で魅力的な選択肢となるのはなぜでしょうか?
哲学:所有権と妥協なきカスタマイズ
HeroUIとMaterial-UIやAnt Designのような従来のUIライブラリとの根本的な違いは、所有権の概念にあります。従来のライブラリをインストールすると、package.json
に依存関係が追加されます。アプリケーションは、このパッケージからプリコンパイルされたコンポーネントをインポートします。これは便利ですが、いくつかの欠点があります。
- 限定的なカスタマイズ:スタイルのオーバーライドは複雑になる可能性があり、しばしば
!important
タグや複雑なテーマプロバイダー設定でライブラリのデフォルトスタイルと戦う必要があります。 - ブラックボックスコンポーネント:コンポーネントの内部ロジックは
node_modules
フォルダに隠されています。予期しない動作のデバッグや内部の仕組みの理解が著しく困難になります。 - バンドルサイズの肥大化:少数のコンポーネントしか使用しない場合でも、ライブラリ全体、またはそのかなりの部分をインポートすることが多く、アプリケーションの最終的なバンドルサイズが増加する可能性があります。
- 依存関係地獄:ライブラリの更新サイクルとその依存関係に縛られます。ライブラリの破壊的な変更により、アプリケーションで大規模なリファクタリングが必要になる場合があります。
HeroUIはこれらの問題を完全に回避します。CLIがコンポーネントのソースコードをプロジェクトのディレクトリ(例: /components/ui
)に直接配置することで、いくつかの重要な方法で開発者を力づけます。
- コードの所有:コンポーネントはあなたのものです。その構造、スタイル、ロジックなど、すべてを変更できます。人工的な制限はありません。独自のアニメーションを持つボタンや、わずかに異なる内部構造が必要な場合は、ファイルを編集するだけです。
- 完全な透明性:使用するすべてのコンポーネントのコードを読むことができます。これは、学習、デバッグ、およびアクセシブルで堅牢なUI要素を構築する方法をより深く理解するために非常に貴重です。
- 未使用コードゼロ:アプリケーションのバンドルには、明示的に追加したコンポーネントのみが含まれます。それ以上はありません。
- デカップリングと将来性:コンポーネントはコードベースの一部であるため、HeroUIのバージョン管理に同じように縛られることはありません。独自のスケジュールでコンポーネントを更新することも、まったく更新しないことも選択できます。3
この哲学は、ゼロから始めることなく、製品のための独自のデザインシステムを構築したい開発者やチームを対象としています。それは、基盤となる、スタイル付けされていない(または軽くスタイル付けされた)プリミティブを提供し、あなたはブランドアイデンティティを提供します。
主な機能の概要
HeroUIは、単なるインストール方法以上のものです。最新の開発ワークフロー向けに設計された機能が満載です。4
- 豊富なコンポーネントコレクション:HeroUIは、ボタン、フォーム、ダイアログ、ドロップダウン、データテーブルなど、最も一般的に必要とされるUIコンポーネントの包括的なセットを提供します。5 各コンポーネントは、アクセシビリティ(ARIA属性)とユーザーエクスペリエンスを考慮して慎重に設計されています。6
- Tailwind CSSによる駆動:HeroUIのスタイル設定機能の中心にあるのは、ユーティリティファーストのCSSフレームワークであるTailwind CSSです。これは、カスタマイズがCSSクラスのオーバーライドではなく、ユーティリティクラスの構成によって行われることを意味します。このアプローチは信じられないほど高速で直感的であり、一貫したデザイン言語を維持するのに役立ちます。HeroUIはTailwindのテーマ設定機能を最大限に活用し、わずか数行の設定でプロジェクト全体に変更を加えることができます。7
- 深いテーマ設定とカスタマイズ:コンポーネント全体のルックアンドフィールは、中心的なテーマ設定を通じて制御できます。8 これには、色、フォント、ボーダーラディウス、間隔などが含まれます。9 これらはすべてCSS変数によって駆動されており、ダークモードの実装のような動的なテーマ設定を信じられないほど簡単に行えます。
- 強力なコマンドラインインターフェース(CLI):
heroui-cli
は、HeroUIエコシステムとやり取りするための主要なツールです。10 プロジェクトの初期化、新しいコンポーネントの追加を処理し、プロジェクトが正しく設定されていることを保証するため、手動設定にかかる時間を節約できます。11 - フレームワークファーストの統合:HeroUIは、最新のフレームワークとシームレスに統合できるように設計されています。12 ドキュメントはNext.jsのファーストクラスのサポートとガイドを提供しており、Reactエコシステムの最も人気のあるツール内でうまく機能するというコミットメントを示しています。これはReactで構築されており、ViteやCreate React Appなどの他のReactベースのフレームワークにも適応できます。13
- デフォルトでのダークモード:ダークモードは後付けではありません。システム全体がダークモードを念頭に置いて構築されており、CSS変数とTailwindの
dark:
バリアントを活用することで、実装が非常に簡単になっています。 - TypeScriptとRSCのサポート:HeroUIはTypeScriptで書かれており、優れた型安全性をすぐに提供します。14 また、React Server Components(RSC)とも互換性があり、Next.jsおよびReactエコシステムの最新の進歩に対応しています。15
HeroUIは誰のためのものか?
HeroUIは、特定のタイプの開発者とプロジェクトにとって理想的な選択肢です:
- 制御を切望する開発者:コンポーネントライブラリの厳格さにうんざりしたことがあるなら、HeroUIは新鮮な空気のように感じられるでしょう。
- 強力でユニークなブランドアイデンティティを持つプロジェクト:他のすべてのウェブサイトと同じに見えないカスタムデザインシステムを構築するための完璧な基盤を提供します。
- スタートアップと製品チーム:迅速に動く必要があるが、スケーラブルで保守可能なフロントエンドアーキテクチャも構築したいチームにとって、HeroUIは強力なアクセラレーターとなるでしょう。
- 学習と開発:ソースコードを入手できるため、高品質でアクセシブルなReactコンポーネントを構築する方法を学ぶための優れたツールです。
最小限の設定で済む、より「箱から出してすぐに使える」、バッテリー付属のソリューションを好む完全な初心者にはあまり適さないかもしれません。HeroUIの力は、その構成可能性にあり、これにはTailwind CSSと最新のフロントエンド開発環境に関する基本的な理解が必要です。
パート2:始める - インストールとセットアップの詳細なウォークスルー
哲学を理解したところで、実際に手を動かしてみましょう。このセクションでは、HeroUIを新規または既存のプロジェクトに統合するための、綿密なステップバイステップガイドを提供します。推奨される最も効率的な方法は、公式のHeroUI CLIを使用することです。16
前提条件
始める前に、開発環境が以下の要件を満たしていることを確認してください。
- Node.js:Node.jsの最新バージョン(通常バージョン18以降)がインストールされている必要があります。17 ターミナルで
node -v
を実行してバージョンを確認できます。 - パッケージマネージャー:
npm
、yarn
、またはpnpm
のようなパッケージマネージャーが必要です。18 このガイドでは、npm
に付属しているnpx
を使用します。19 - Reactフレームワークプロジェクト:HeroUIは、Reactフレームワークで構築されたプロジェクトに追加できるように設計されています。主なガイドではNext.jsに焦点を当てていますが、ViteやCreate React Appなどの他のフレームワークにも適応できます。最良のエクスペリエンスを得るために、新しいNext.jsプロジェクトから開始することを想定します。次のコマンドで作成できます:Bash
npx create-next-app@latest my-heroui-app
Next.jsのセットアップ中に、TypeScriptとTailwind CSSを選択することを推奨します。これらはHeroUIエコシステムの基盤となるためです。
HeroUI CLI init
コマンド:あなたの出発点
init
コマンドは、HeroUIの世界への魔法の入り口です。プロジェクトをインテリジェントに検査し、一連の質問を尋ね、必要なすべてを自動的に設定します。
プロジェクトディレクトリに移動します:Bash
cd my-heroui-app
次に、初期化コマンドを実行します:Bash
npx heroui-cli@latest init
CLIがセットアッププロセスをガイドします。各質問と選択肢の意味を詳しく見ていきましょう。
1. 「どのスタイルを使用しますか?」
- オプション:
Default
,New York
- 説明:この選択は、コンポーネントの基本となる美的感覚を定義します。20
Default
はよりモダンでミニマリストなスタイルであり、New York
はわずかに伝統的でコーポレートな外観を提供します。この選択は、CLIが設定するボーダーラディウスや間隔などのデフォルトのスタイル設定に主に影響します。この選択に縛られるわけではありません。これは後で完全にカスタマイズできる単なる出発点です。クリーンな状態から始めるには、Default
が良い選択肢となることが多いです。
2. 「ベースカラーとしてどの色を使用しますか?」
- オプション:
Slate
,Gray
,Zinc
,Neutral
,Stone
- 説明:HeroUIのカラーシステム全体は、ニュートラルなベースカラーの色合いに基づいています。この選択は、背景、テキスト、ボーダー、コンポーネントの状態の主要なパレットを決定します。たとえば、
Slate
を選択するとUIにクールで青みがかったグレーの色調が与えられ、Stone
はより暖かく素朴な感触を提供します。CLIは、選択に基づいてCSS変数の全スペクトルを自動的に生成します。
3. 「グローバルCSSファイルはどこにありますか?」
- デフォルト:
app/globals.css
(Next.js App Routerの場合) またはstyles/globals.css
(Pages Routerの場合)。 - 説明:CLIは、コアCSS変数とTailwindディレクティブをどこに注入する必要があるかを知る必要があります。標準的なNext.jsプロジェクトでは、正しいパスを検出するのに通常は十分賢いです。非標準のプロジェクト構造を使用している場合にのみ、これを変更する必要があります。
4. 「色にCSS変数を使用しますか?」
- デフォルト:
Yes
- 説明:ほとんどの場合、「はい」と答えるべきです。CSS変数を使用することは、HeroUIのテーマ設定システムの基礎です。21 これにより、カラーパレットを1か所(
globals.css
)で定義し、それがどこでも自動的に適用されるようにすることができます。22 さらに重要なのは、ダークモードのような動的な機能を可能にするものです。
5. 「tailwind.config.js
ファイルはどこにありますか?」
- デフォルト:
tailwind.config.js
- 説明:CLIは、HeroUIのテーマプリセットとプラグインを統合するために、Tailwind設定を変更する必要があります。これも自動的に検出されるはずです。
6. 「コンポーネントのインポートエイリアスを設定します。」
- デフォルト:
@/components
- 説明:パスエイリアスは、クリーンなインポートステートメントのためのベストプラクティスです。23
import { Button } from '../../../components/ui/button'
と書く代わりに、import { Button } from '@/components/ui/button'
と書くことができます。CLIは、コンポーネントに使用したいエイリアスを知る必要があります。これにより、tsconfig.json
(またはjsconfig.json
)で設定できます。デフォルトの@/components
は妥当な選択です。
7. 「ユーティリティのインポートエイリアスを設定します。」
- デフォルト:
@/lib/utils
- 説明:HeroUIはいくつかのユーティリティ関数に依存しており、最も注目すべきはTailwindクラスを条件付きでマージする関数(しばしば
cn
と呼ばれる)です。CLIはあなたのためにこのユーティリティファイルを作成し、それをどこに配置し、どのエイリアスを使用するかを知る必要があります。デフォルトの@/lib/utils
は標準的です。
8. 「React Server Componentsを使用していますか?」
- デフォルト:お使いのNext.jsのバージョンと設定に基づいて自動検出されます。
- 説明:これは、App Routerを使用する最新のNext.jsアプリケーションにとって非常に重要です。
Yes
と回答すると、CLIによって追加されるコンポーネントに必要な場合に"use client"
ディレクティブが含まれることが保証されます。このディレクティブは、クライアントサイドのインタラクティビティ(onClick
イベントの処理やuseState
のようなフックの使用など)を必要とするコンポーネントをマークし、React Server Componentsとの互換性を持たせます。24
すべての質問に答えると、CLIはその魔法を実行します。それは以下のことを行います:
- 必要な依存関係(
tailwindcss-animate
、class-variance-authority
、lucide-react
など)をインストールします。 - プロジェクトのルートに
components.json
ファイルを作成します。 - 正しいテーマ設定で
tailwind.config.js
を変更します。 globals.css
にベーススタイルと、選択したカラーテーマのすべてのCSS変数を設定します。- 設定したパスエイリアスで
tsconfig.json
またはjsconfig.json
を更新します。 cn
ユーティリティ関数を含むlib/utils.ts
ファイルを作成します。
これで、プロジェクトは完全に設定され、HeroUIを使用する準備が整いました。
変更点の解剖
CLIが変更または作成した主要なファイルを詳しく見てみましょう。
components.json
このファイルは、プロジェクト内のHeroUIのマニフェストです。init
プロセス中に選択した内容を保存し、プロジェクトがどのように設定されているかをCLIに伝えます。JSON
{
"$schema": "https://www.heroui.com/schema.json",
"style": "default",
"rsc": true,
"tsx": true,
"tailwind": {
"config": "tailwind.config.js",
"css": "app/globals.css",
"baseColor": "slate",
"cssVariables": true
},
"aliases": {
"utils": "@/lib/utils",
"components": "@/components"
}
}
このファイルを手動で編集する必要はほとんどありませんが、その目的を理解しておくと役立ちます。これはCLIの操作の頭脳です。
tailwind.config.js
Tailwindの設定は、このように拡張されます。主な追加点は、theme
の拡張とtailwindcss-animate
プラグインです。JavaScript
/** @type {import('tailwindcss').Config} */
module.exports = {
darkMode: ["class"],
content: [
'./pages/**/*.{ts,tsx}',
'./components/**/*.{ts,tsx}',
'./app/**/*.{ts,tsx}',
'./src/**/*.{ts,tsx}',
],
theme: {
container: {
center: true,
padding: "2rem",
screens: {
"2xl": "1400px",
},
},
extend: {
colors: {
border: "hsl(var(--border))",
input: "hsl(var(--input))",
// ... and many more color definitions linked to CSS variables
primary: {
DEFAULT: "hsl(var(--primary))",
foreground: "hsl(var(--primary-foreground))",
},
// ...
},
borderRadius: {
lg: "var(--radius)",
md: "calc(var(--radius) - 2px)",
sm: "calc(var(--radius) - 4px)",
},
keyframes: {
// ... keyframes for animations
},
animation: {
// ... animation utilities
},
},
},
plugins: [require("tailwindcss-animate")],
}
primary
のような色が、HEXコードではなくhsl(var(--primary))
で定義されていることに注目してください。これは、TailwindにグローバルCSSで定義されている--primary
という名前のCSS変数を使用するように指示します。
app/globals.css
このファイルは、デザインシステムのテーマの中心となります。基本のTailwindディレクティブと、CSS変数の大きなブロックが含まれます。CSS
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
:root {
--background: 0 0% 100%;
--foreground: 222.2 84% 4.9%;
--card: 0 0% 100%;
/* ... many more variables for the light theme */
--radius: 0.5rem;
}
.dark {
--background: 222.2 84% 4.9%;
--foreground: 210 40% 98%;
--card: 222.2 84% 4.9%;
/* ... many more variables for the dark theme */
}
}
ここで、この設定の威力を確認できます。すべてのライトテーマの色は:root
スコープで定義され、すべてのダークテーマの色は.dark
クラススコープ内で定義されます。<html>
要素に.dark
クラスが追加されると、ブラウザは自動的にダークテーマの変数を使用します。
パート3:カスタマイズをマスターする - テーマ設定、レイアウト、ダークモード
HeroUIが初期化されたら、本当の楽しみが始まります。それは自分自身のものにすることです。アーキテクチャは、深く直感的なカスタマイズのために明確に設計されています。25
CSS変数によるテーマ設定の技
HeroUIのテーマ設定は、他のライブラリに見られるような複雑なJavaScriptベースのテーマオブジェクトとは異なります。よりシンプルで強力であり、最新のCSS機能を活用しています。テーマ全体(色、ボーダーラディウス、フォント)は、globals.css
ファイルで定義されたCSS変数によって制御されます。
色の変更
プライマリブランドカラーを変更したいとしましょう。Tailwindの設定に入る必要はありません。globals.css
で関連するCSS変数を見つけて、その値を変更するだけです。
色はHSL(色相、彩度、明度)値を使用して定義されますが、hsl()
ラッパーはありません。例:CSS
:root {
/* ... */
--primary: 221.2 83.2% 53.3%;
--primary-foreground: 210 40% 98%;
/* ... */
}
.dark {
/* ... */
--primary: 217.2 91.2% 59.8%;
--primary-foreground: 210 40% 98%;
/* ... */
}
プライマリカラーを鮮やかな緑に変更するには、オンラインカラーピッカーを使用して選択した色合いのHSL値を見つけ、変数を更新します:CSS
/* In globals.css */
:root {
/* ... */
--primary: 142.1 76.2% 36.3%; /* New Green Primary Color */
--primary-foreground: 355.7 100% 97.3%; /* A contrasting light color for text on the primary color */
/* ... */
}
.dark {
/* ... */
--primary: 142.1 70.2% 46.3%; /* A slightly different green for dark mode */
--primary-foreground: 355.7 100% 97.3%;
/* ... */
}
このファイルを保存すると、「primary」色を使用するすべてのコンポーネント(<Button>
など)は、アプリケーション全体で瞬時に更新され、この新しい緑色を反映します。これは信じられないほど強力です。
ボーダーラディウスの変更
カードや入力などのコンポーネントの角の丸みは、単一のCSS変数--radius
によって制御されます。CSS
/* In globals.css */
:root {
/* ... */
--radius: 0.5rem; /* The default value */
}
よりシャープで角張った外観を好む場合は、この値を減らすことができます:CSS
:root {
--radius: 0.25rem; /* Less rounded */
}
または、非常にソフトで丸みを帯びた美的感覚のために、これを増やすことができます:CSS
:root {
--radius: 1.5rem; /* Very rounded */
}
この1行の変更は、すべてのコンポーネントにカスケードされ、UI全体で一貫したボーダーラディウスを保証します。
新しい色の追加
init
コマンドによって提供される色に限定されません。独自のセマンティックカラーを簡単に追加できます。たとえば、「special」ブランドカラーを追加してみましょう。
globals.css
でCSS変数を定義します:CSS
/* In globals.css */
:root {
/* ... */
--special: 320 86% 59%;
--special-foreground: 330 100% 98%;
}
.dark {
/* ... */
--special: 320 80% 69%;
--special-foreground: 330 100% 98%;
}
tailwind.config.js
でTailwindに公開します:JavaScript
// In tailwind.config.js
// ...
extend: {
colors: {
// ...
special: {
DEFAULT: "hsl(var(--special))",
foreground: "hsl(var(--special-foreground))",
},
},
},
// ...
これで、bg-special
やtext-special-foreground
のようなTailwindのユーティリティクラスを使用して、コンポーネントでこれらの色を使用できます。
レスポンシブレイアウトの構築
HeroUIコンポーネントはTailwind CSSで構築されており、これはそれらが本質的にレスポンシブであることを意味します。26 任意のユーティリティクラスでTailwindのレスポンシブプレフィックス(sm:
、md:
、lg:
、xl:
)を使用して、異なる画面サイズでコンポーネントのスタイルを変更できます。27
デスクトップでは表示され、モバイルでは折りたたまれるサイドバーを持つシンプルなページレイアウトを構築することを想像してみましょう。HeroUIは低レベルのコンポーネント(Card
、Button
)を提供しますが、それらをより大きなレイアウトに構成するのはあなたの責任です。
Next.jsのページコンポーネントでこれをどのように構造化するかの例を以下に示します:TypeScript
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Button } from "@/components/ui/button";
export default function DashboardPage() {
return (
<div className="flex min-h-screen flex-col md:flex-row">
{/* Sidebar */}
<aside className="w-full border-b bg-muted p-4 md:w-64 md:border-b-0 md:border-r">
<h2 className="text-lg font-semibold">Navigation</h2>
<nav className="mt-4 flex flex-row space-x-2 md:flex-col md:space-x-0 md:space-y-2">
<Button variant="ghost" className="justify-start">Dashboard</Button>
<Button variant="ghost" className="justify-start">Settings</Button>
<Button variant="ghost" className="justify-start">Profile</Button>
</nav>
</aside>
{/* Main Content */}
<main className="flex-1 p-8">
<h1 className="text-4xl font-bold tracking-tight">Dashboard</h1>
<p className="mt-2 text-muted-foreground">
Welcome to your dashboard.
</p>
<div className="mt-8 grid gap-4 sm:grid-cols-2 lg:grid-cols-3">
<Card>
<CardHeader>
<CardTitle>Revenue</CardTitle>
</CardHeader>
<CardContent>
<p className="text-3xl font-bold">$45,231.89</p>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle>Subscriptions</CardTitle>
</CardHeader>
<CardContent>
<p className="text-3xl font-bold">+2350</p>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle>Active Users</CardTitle>
</CardHeader>
<CardContent>
<p className="text-3xl font-bold">+573</p>
</CardContent>
</Card>
</div>
</main>
</div>
);
}
この例では:
- メインコンテナは
flex
コンテナです。モバイル(flex-col
)では、サイドバーは上部にあります。中画面以上(md:flex-row
)では、横並びのレイアウトに切り替わります。 aside
はモバイルでは全幅(w-full
)ですが、デスクトップでは固定幅(md:w-64
)です。- メインコンテンツエリアは、画面サイズに基づいて列数を調整する
grid
レイアウトを使用しています(sm:grid-cols-2
、lg:grid-cols-3
)。 - これはコア原則を示しています:HeroUIはスタイル付けされたプリミティブ(
Card
、Button
)を提供し、あなたはTailwind CSSの全能力を使用して、それらをレスポンシブで複雑なレイアウトに配置します。28
完璧なダークモードの実装
HeroUIの最もエレガントな機能の1つは、ダークモードの組み込みサポートです。29 init
コマンドがすでにライト(:root
)とダーク(.dark
)の両方のテーマのカラー変数を設定しているため、実装は驚くほど簡単です。
最も一般的なアプローチは、テーマ切り替えを処理し、ユーザーの選択をローカルストレージに保持するnext-themes
パッケージを使用することです。
next-themes
をインストールします:Bash
npm install next-themes
テーマプロバイダーを作成します:
新しいファイルを作成します。例えば、components/theme-provider.tsxに作成します。TypeScript
"use client";
import * as React from "react";
import { ThemeProvider as NextThemesProvider } from "next-themes";
import { type ThemeProviderProps } from "next-themes/dist/types";
export function ThemeProvider({ children, ...props }: ThemeProviderProps) {
return <NextThemesProvider {...props}>{children}</NextThemesProvider>;
}
ルートレイアウトをプロバイダーでラップします:
Next.jsのルートレイアウト(app/layout.tsx)で、ThemeProviderをインポートして使用します。30TypeScript
import { ThemeProvider } from "@/components/theme-provider";
import type { Metadata } from "next";
import { Inter } from "next/font/google";
import "./globals.css";
const inter = Inter({ subsets: ["latin"] });
export const metadata: Metadata = {
title: "Create Next App",
description: "Generated by create next app",
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="en" suppressHydrationWarning>
<body className={inter.className}>
<ThemeProvider
attribute="class"
defaultTheme="system"
enableSystem
disableTransitionOnChange
>
{children}
</ThemeProvider>
</body>
</html>
);
}
ここでの主要なpropsは次のとおりです:
attribute="class"
:next-themes
に、<html>
要素にクラスを追加/削除することでテーマを切り替えるように指示します。31default