シャドシーエヌ・ユーアイ(shadcn/ui)で開発が爆速に!警察とヤクザも納得の高品質UIコンポーネント徹底解説
(舞台
開発フロア。警察官の格好をしたエンジニアAと、ヤクザの格好をしたエンジニアBが、締切間近のモニターの前で言い争っている。)
エンジニアA(警察)
「おいB!この画面のボタン、なんでアクセシビリティが確保されてねぇんだ!ARIA属性は!?キーボード操作は!?ユーザーが困ってるだろうが!」
エンジニアB(ヤクザ)
「うるせぇなA!こっちはデザインから機能まで、一から全部手打ちでやってんだ!そんな細かいとこまで手が回るか!デザイナーもいねえのに、モダンでカッコいいUIなんか作れるかよ、コノヤロー!」
エンジニアA(警察)
「馬鹿野郎!そんなこと言ってるから、開発スピードが激遅なんだ!このままだとリリースが遅れて、上からお叱りだぞ!」
(そこに、颯爽とshadcn/uiと書かれたシャツを着たプロフェッショナルな開発者Cが登場!)
開発者C「落ち着け、お二人さん。そんな泥沼のような戦いはもう終わりにしましょう。『shadcn/ui』って知ってますか?」
開発者Cさんが持ってきたshadcn/ui。これがなぜエンジニアの皆さんにとって「救世主」なのか、そのメリットを解説します!
エンジニアB(ヤクザ)
「ボタンやらフォームやら、イチからCSS書いて、状態管理して……正直、面倒くさくて時間がかかりすぎるんだよ!」
開発者C
「その通り!でも shadcn/ui は、Tailwind CSS をベースにしたモダンで高品質なコンポーネント集です。ButtonやCardといったよく使うUIを、完成された状態でプロジェクトにコピー&ペーストして使えます。一から作る手間がゼロになるから、プロトタイプだろうが本番機能だろうが、爆速で画面が組めますよ。」
エンジニアA(警察)
「でも、その完成品とやらが、粗悪品だったら困るんだ!特にアクセシビリティ!全てのユーザーが使えるようにするのは開発者の責務だ!」
開発者C
「ご安心を。shadcn/ui のコンポーネントの多くは、Radix UI という、アクセシビリティと機能性に特化したライブラリを土台に作られています。キーボードナビゲーションやARIA属性など、面倒な部分はRadix UIが面倒を見てくれているので、エンジニアは心配せずに、安心して高品質なコンポーネントを使えるわけです。」
エンジニアB(ヤクザ)
「既存のUIライブラリは、見た目を変えようとすると、上書き地獄になって、結局CSSがグチャグチャになりがちだぜ!」
開発者C 「ここが shadcn/ui の最大の特徴です。他のライブラリのようにnpmでインストールしてブラックボックスとして使うのではなく、コンポーネントの 『ソースコード』自体をあなたのプロジェクトにダウンロード(コピー)します。
完全な制御権
コードが手元にあるので、Tailwind CSSで見た目を、Reactでロジックを、あなたのプロジェクトのルールに合わせて自由に、徹底的にカスタマイズできます。
依存の解消
ライブラリのバージョンアップに怯える必要もありません。あなたのプロジェクトに必要なコードだけが存在するので、将来的な変更にも柔軟に対応できますよ。」
さあ、この便利なツールをあなたのプロジェクトに導入しましょう。
まず、ReactやNext.jsなどのプロジェクトが準備されていることを確認します。
プロジェクトのルートディレクトリで、以下のコマンドを実行します。
npx shadcn-ui@latest init
このコマンドを実行すると、以下のような質問がターミナルで対話形式で始まります。
| 質問 | 説明 |
Would you like to use TypeScript? | TypeScriptを使うか?(強く推奨します) |
Which style would you like to use? | コンポーネントの基本スタイルを選ぶ |
Which color would you like to use as base color? | ベースカラーを選ぶ |
Where is your global CSS file? | globals.cssなど、あなたのCSSファイルのパス |
Configure the import alias for components... | コンポーネントのインポートを@/componentsのように短くするための設定 |
この設定により、components.jsonファイルと、プロジェクトに合わせたTailwind CSSの設定、ユーティリティ関数などが追加されます。
使いたいコンポーネントだけを、必要な時に追加していきます。
例えば、「ボタン」を追加したい場合
npx shadcn-ui@latest add button
このコマンドを実行すると、ボタンのコンポーネントファイル(例ui/button.tsx)が、設定したディレクトリ(通常は@/components/ui)にコピーされます。
追加したコンポーネントは、通常のReactコンポーネントとしてすぐに利用できます。
// components/MyForm.tsx
import { Button } from "@/components/ui/button"; // ← インポートパスは設定による
function MyLoginForm() {
return (
<form onSubmit={(e) => {
e.preventDefault();
alert("ログイン!");
}}>
{/* ★これが shadcn/ui のボタンです!
見た目、アクセシビリティ、全て整っています。
variant="destructive" で赤色に、type="submit" でフォーム送信の役割に。
*/}
<Button
type="submit"
variant="destructive"
className="w-full mt-4" // Tailwind CSSで簡単にカスタマイズ
>
ログイン
</Button>
{/* デフォルトのボタン (variant="default") */}
<Button className="mt-2">
ゲストログイン
</Button>
</form>
);
}
export default MyLoginForm;
エンジニアA(警察)
「なるほど!Radixで機能は担保され、Tailwindで見た目も自由!しかも、必要なものだけをコードとして持ってくるから、プロジェクト全体がクリーンだ!」
エンジニアB(ヤクザ)
「へへっ、こいつぁ最高にクールだぜ。もう面倒なことは、こいつに任せちまえばいいってわけだ!」
開発者C
「その通り。shadcn/uiは、あなた方の戦場を整理し、本質的な機能開発に集中するための強力な武器になりますよ!」