HeroUIとは?次世代UIライブラリの魅力と使い方を徹底解説

本記事では、新しいUIライブラリ「HeroUI」について解説します。スタイル未適用のコンポーネントを直接提供し、透明性・高いカスタマイズ性・モダンな開発体験を実現する点が特徴です。

Mark Ponomarev

Mark Ponomarev

16 10月 2025

HeroUIとは?次世代UIライブラリの魅力と使い方を徹底解説
💡
美しいAPIドキュメントを生成する優れたAPIテストツールをお探しですか?

生産性を最大化して開発チームが共同作業できる、統合されたオールインワンプラットフォームをお探しですか?

Apidogは、お客様のあらゆる要求に応え、Postmanをはるかに手頃な価格で置き換えます

button

フロントエンド開発者にとって、見た目が美しく、高性能で、高度にカスタマイズ可能なユーザーインターフェースへの要求はかつてないほど高まっています。開発者は、品質や創造的な制御を犠牲にすることなく、ワークフローを加速できるツールを常に探しています。モノリシックな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に依存関係が追加されます。アプリケーションは、このパッケージからプリコンパイルされたコンポーネントをインポートします。これは便利ですが、いくつかの欠点があります。

  1. 限定的なカスタマイズ:スタイルのオーバーライドは複雑になる可能性があり、しばしば!importantタグや複雑なテーマプロバイダー設定でライブラリのデフォルトスタイルと戦う必要があります。
  2. ブラックボックスコンポーネント:コンポーネントの内部ロジックはnode_modulesフォルダに隠されています。予期しない動作のデバッグや内部の仕組みの理解が著しく困難になります。
  3. バンドルサイズの肥大化:少数のコンポーネントしか使用しない場合でも、ライブラリ全体、またはそのかなりの部分をインポートすることが多く、アプリケーションの最終的なバンドルサイズが増加する可能性があります。
  4. 依存関係地獄:ライブラリの更新サイクルとその依存関係に縛られます。ライブラリの破壊的な変更により、アプリケーションで大規模なリファクタリングが必要になる場合があります。

HeroUIはこれらの問題を完全に回避します。CLIがコンポーネントのソースコードをプロジェクトのディレクトリ(例: /components/ui)に直接配置することで、いくつかの重要な方法で開発者を力づけます。

この哲学は、ゼロから始めることなく、製品のための独自のデザインシステムを構築したい開発者やチームを対象としています。それは、基盤となる、スタイル付けされていない(または軽くスタイル付けされた)プリミティブを提供し、あなたはブランドアイデンティティを提供します。

主な機能の概要

HeroUIは、単なるインストール方法以上のものです。最新の開発ワークフロー向けに設計された機能が満載です。4

HeroUIは誰のためのものか?

HeroUIは、特定のタイプの開発者とプロジェクトにとって理想的な選択肢です:

最小限の設定で済む、より「箱から出してすぐに使える」、バッテリー付属のソリューションを好む完全な初心者にはあまり適さないかもしれません。HeroUIの力は、その構成可能性にあり、これにはTailwind CSSと最新のフロントエンド開発環境に関する基本的な理解が必要です。

パート2:始める - インストールとセットアップの詳細なウォークスルー

哲学を理解したところで、実際に手を動かしてみましょう。このセクションでは、HeroUIを新規または既存のプロジェクトに統合するための、綿密なステップバイステップガイドを提供します。推奨される最も効率的な方法は、公式のHeroUI CLIを使用することです。16

前提条件

始める前に、開発環境が以下の要件を満たしていることを確認してください。

npx create-next-app@latest my-heroui-app

Next.jsのセットアップ中に、TypeScriptTailwind CSSを選択することを推奨します。これらはHeroUIエコシステムの基盤となるためです。

HeroUI CLI initコマンド:あなたの出発点

initコマンドは、HeroUIの世界への魔法の入り口です。プロジェクトをインテリジェントに検査し、一連の質問を尋ね、必要なすべてを自動的に設定します。

プロジェクトディレクトリに移動します:Bash

cd my-heroui-app

次に、初期化コマンドを実行します:Bash

npx heroui-cli@latest init

CLIがセットアッププロセスをガイドします。各質問と選択肢の意味を詳しく見ていきましょう。

1. 「どのスタイルを使用しますか?」

2. 「ベースカラーとしてどの色を使用しますか?」

3. 「グローバルCSSファイルはどこにありますか?」

4. 「色にCSS変数を使用しますか?」

5. 「tailwind.config.jsファイルはどこにありますか?」

6. 「コンポーネントのインポートエイリアスを設定します。」

7. 「ユーティリティのインポートエイリアスを設定します。」

8. 「React Server Componentsを使用していますか?」

すべての質問に答えると、CLIはその魔法を実行します。それは以下のことを行います:

これで、プロジェクトは完全に設定され、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-specialtext-special-foregroundのようなTailwindのユーティリティクラスを使用して、コンポーネントでこれらの色を使用できます。

レスポンシブレイアウトの構築

HeroUIコンポーネントはTailwind CSSで構築されており、これはそれらが本質的にレスポンシブであることを意味します。26 任意のユーティリティクラスでTailwindのレスポンシブプレフィックス(sm:md:lg:xl:)を使用して、異なる画面サイズでコンポーネントのスタイルを変更できます。27

デスクトップでは表示され、モバイルでは折りたたまれるサイドバーを持つシンプルなページレイアウトを構築することを想像してみましょう。HeroUIは低レベルのコンポーネント(CardButton)を提供しますが、それらをより大きなレイアウトに構成するのはあなたの責任です。

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>
  );
}

この例では:

完璧なダークモードの実装

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>
  );
}

ここで重要なプロパティは以下の通りです:

テーマ切り替えボタンの作成:

次に、ユーザーがテーマを切り替えられるUI要素を用意します。

"use client";

import * as React from "react";
import { Moon, Sun } from "lucide-react";
import { useTheme } from "next-themes";
import { Button } from "@/components/ui/button";

export function ModeToggle() {
  const { setTheme, theme } = useTheme();

  const toggleTheme = () => {
    setTheme(theme === "light" ? "dark" : "light");
  };

  return (
    <Button variant="outline" size="icon" onClick={toggleTheme}>
      <Sun className="h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
      <Moon className="absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" />
      <span className="sr-only">Toggle theme</span>
    </Button>
  );
}

このコンポーネントは、next-themesuseThemeフックを利用して、現在のテーマを取得し、新しいテーマを設定します。回転する太陽と月のアイコンによって、視覚的にもスムーズな切り替えが実現できます。<ModeToggle />コンポーネントをヘッダーなどUIの任意の場所に配置するだけで、永続的に動作するダークモード切り替え機能が実装できます。

パート4: The HeroUI CLIとコンポーネント中心のワークフロー

heroui-cliは単なるインストーラーではありません。これは、コンポーネントライブラリの管理や拡張を行うための主要なツールです。初期化後の主な役割は、新しいコンポーネントをプロジェクトに追加することにあります。

コンポーネントの追加:コアワークフロー

例えば、アプリケーションにダイアログモーダルが必要になったとします。ゼロから実装する代わりに、CLIを使ってHeroUIのアクセシビリティに配慮したDialogコンポーネントを追加することができます。

コマンドは非常にシンプルです。

npx heroui-cli@latest add dialog

CLIは以下の処理を自動で行います。

これで、プロジェクト内にdialog.tsxファイルが生成されます。コードを確認したり、学習目的で参照したり、自由にカスタマイズすることも可能です。例えば、デフォルトのDialogに含まれるトランジションが好みに合わない場合は、ファイルを開いてアニメーションを制御するTailwindクラスを編集するだけで対応できます。この柔軟なコントロールこそが、HeroUIの大きな特長です。

複数のコンポーネントを一括で追加することも可能です。

npx heroui-cli@latest add card button input label

このコマンドにより、4つのコンポーネントとその依存関係が一度にプロジェクトへ追加されます。

CLI APIの理解:components.json

components.jsonファイルは、プロジェクトとHeroUI CLI間の契約書のような役割を果たします。各プロパティがCLIの挙動にどのように影響するか、改めて確認しましょう。

この設定内容を理解しておくことで、プロジェクト構成をリファクタリングする際(例:コンポーネントディレクトリを@/componentsから@/uiへ移動する場合など)にも、CLIの挙動を手動で調整することができます。

結論:HeroUIで自由な開発を

HeroUIは、UIライブラリの新しい活用方法を提案します。従来のブラックボックス的な「一律提供」モデルから脱却し、透明性と高いカスタマイズ性を兼ね備えた開発体験を実現します。スタイル未適用かつアクセシビリティに配慮したコンポーネントをソースコードとして直接提供することで、迅速な開発と独自デザインの両立を可能にしています。

HeroUIの主な強みは以下の通りです。

HeroUIは、UIをプロダクトのアイデンティティの中核と捉える開発者・クリエイター・チームのためのツールです。完成品の家を提供するのではなく、最高品質の素材と整理された作業場を提供し、理想の家を自らの手で作り上げるための環境を整えます。独自性・洗練性・保守性を求める次のプロジェクトには、HeroUIが最適な選択肢となるでしょう。あなたの理想とするUIを実現するための最強のパートナーとなるはずです。

💡
美しいAPIドキュメントを生成する優れたAPIテストツールをお探しですか?

生産性を最大化して開発チームが共同作業できる、統合されたオールインワンプラットフォームをお探しですか?

Apidogは、お客様のあらゆる要求に応え、Postmanをはるかに手頃な価格で置き換えます
button

Explore more

Postman価格2026年 最新情報: 変更点と乗り換えの理由

Postman価格2026年 最新情報: 変更点と乗り換えの理由

本記事では、Postmanの2026年の価格変更と料金プランの構成を整理します。無料プラン、Solo、チーム、エンタープライズ各プランの価格や機能を比較し、AIクレジットやアドオン、年間請求などのコスト要素について説明します。また、開発者やチーム利用の観点から、価格変更がAPIワークフローやコラボレーションに与える影響を整理します。

3 3月 2026

OpenClaw(Moltbot/Clawdbot)がサポートするAIモデルとは?

OpenClaw(Moltbot/Clawdbot)がサポートするAIモデルとは?

本記事では、OpenClawが採用するモデルサポートの仕組みを整理し、OpenAI互換API、Anthropicスタイルのインターフェース、ローカル/セルフホスト型ランタイムへの接続方法を解説する。さらに、検索やルーティングで利用される埋め込みモデルやリランカーモデルの役割を示し、ツール呼び出し、スキーマ準拠、レイテンシ、安全性、コストといった観点から、本番環境での実質的なサポート可否をどのように評価するか、その判断軸を明確化する。

12 2月 2026

OpenClaw (Moltbot/Clawdbot) が対応するメッセージングアプリの範囲

OpenClaw (Moltbot/Clawdbot) が対応するメッセージングアプリの範囲

本記事では、OpenClawを複数のメッセージング環境へ展開する際の構成方法を整理し、統一されたイベント/レスポンス契約を基盤として各プラットフォームとの差異をアダプタで吸収する仕組みを解説する。Bot APIを持つリアルタイムチャット、制限付きインターフェースの暗号化アプリ、公式APIを持たないクライアント環境などの分類とともに、コネクタ構造、ポリシーレイヤー、実行基盤、信頼性確保の設計要素を扱う。

11 2月 2026

ApidogでAPIデザイン中心のアプローチを取る

APIの開発と利用をよりシンプルなことにする方法を発見できる