Agent-almanac setup-tailwind-typescript
install
source · Clone the upstream repo
git clone https://github.com/pjt222/agent-almanac
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/pjt222/agent-almanac "$T" && mkdir -p ~/.claude/skills && cp -r "$T/i18n/ja/skills/setup-tailwind-typescript" ~/.claude/skills/pjt222-agent-almanac-setup-tailwind-typescript-8e1534 && rm -rf "$T"
manifest:
i18n/ja/skills/setup-tailwind-typescript/SKILL.mdsource content
TypeScriptでTailwind CSSをセットアップ
カスタムテーマ、ユーティリティ、型安全なパターンを持つTypeScriptプロジェクトにTailwind CSSを設定します。
使用タイミング
- 既存のTypeScriptプロジェクトにTailwind CSSを追加するとき
- プロジェクトのデザインシステム向けにTailwindテーマをカスタマイズするとき
- 型安全なコンポーネントスタイリングパターンをセットアップするとき
- Tailwindプラグインや拡張機能を設定するとき
入力
- 必須: TypeScriptプロジェクト(Next.js、Vite、またはスタンドアロンReact)
- オプション: デザインシステムトークン(色、スペーシング、フォント)
- オプション: 含めるTailwindプラグイン
手順
ステップ1: Tailwind CSSのインストール
npm install -D tailwindcss @tailwindcss/postcss postcss
Next.jsの場合(まだ含まれていない場合):
npm install -D tailwindcss postcss autoprefixer npx tailwindcss init -p
期待結果:
tailwindcss、postcss、autoprefixerが開発依存関係としてインストールされます。Next.jsの場合、npx tailwindcss init -pによりtailwind.config.tsとpostcss.config.jsが生成されます。
失敗時:
npx tailwindcss initが失敗する場合は、まずnpm install -D tailwindcssでTailwindをインストールして再試行してください。モノリポを使用している場合は、ワークスペースのルートではなくアプリのルートディレクトリからコマンドを実行してください。
ステップ2: tailwind.config.tsの設定
import type { Config } from "tailwindcss"; const config: Config = { content: [ "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", "./src/components/**/*.{js,ts,jsx,tsx,mdx}", "./src/app/**/*.{js,ts,jsx,tsx,mdx}", ], theme: { extend: { colors: { primary: { 50: "#eff6ff", 100: "#dbeafe", 500: "#3b82f6", 600: "#2563eb", 700: "#1d4ed8", 900: "#1e3a5f", }, secondary: { 500: "#6366f1", 600: "#4f46e5", }, }, fontFamily: { sans: ["Inter", "system-ui", "sans-serif"], mono: ["JetBrains Mono", "monospace"], }, spacing: { "18": "4.5rem", "88": "22rem", }, }, }, plugins: [], }; export default config;
期待結果:
tailwind.config.tsのcontent配列がプロジェクトのファイル位置と一致し、theme.extendにカスタム色とフォントが設定され、Configインポートで適切なTypeScript型付けがされています。
失敗時: カスタムクラスがレンダリングされない場合は、
contentパスが実際のディレクトリ構造と一致するか確認してください。パスはプロジェクトルートからの相対的なglobパターンです。パスが欠けている場合、Tailwindはそれらのファイルのクラス使用をスキャンしません。
ステップ3: グローバルスタイルのセットアップ
src/app/globals.cssを編集します:
@tailwind base; @tailwind components; @tailwind utilities; @layer base { html { @apply antialiased; } body { @apply bg-white text-gray-900 dark:bg-gray-950 dark:text-gray-100; } } @layer components { .btn-primary { @apply bg-primary-600 text-white px-4 py-2 rounded-lg hover:bg-primary-700 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2 transition-colors duration-200; } }
期待結果:
globals.cssに3つのTailwindディレクティブ(@tailwind base、@tailwind components、@tailwind utilities)とカスタムベースおよびコンポーネントレイヤースタイルが含まれています。ファイルはルートレイアウトでインポートされています。
失敗時: スタイルが適用されない場合は、
globals.cssがlayout.tsx(またはPages Routerの_app.tsx)でインポートされているか確認してください。Tailwindディレクティブが存在し、コメントアウトされていないことを確認してください。
ステップ4: 型安全なユーティリティヘルパーの作成
src/lib/cn.tsを作成します:
import { type ClassValue, clsx } from "clsx"; import { twMerge } from "tailwind-merge"; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); }
依存関係のインストール:
npm install clsx tailwind-merge
コンポーネントでの使用:
import { cn } from "@/lib/cn"; interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> { variant?: "primary" | "secondary" | "outline"; } export function Button({ className, variant = "primary", ...props }: ButtonProps) { return ( <button className={cn( "px-4 py-2 rounded-lg font-medium transition-colors", variant === "primary" && "bg-primary-600 text-white hover:bg-primary-700", variant === "secondary" && "bg-secondary-500 text-white hover:bg-secondary-600", variant === "outline" && "border border-gray-300 hover:bg-gray-50", className )} {...props} /> ); }
期待結果:
src/lib/cn.tsがcn()関数をエクスポートします。clsxとtailwind-mergeが依存関係としてインストールされています。コンポーネントがcn()を使って競合なしにクラス名をマージします。
失敗時:
clsxまたはtailwind-mergeが見つからない場合はnpm install clsx tailwind-mergeを実行してください。TypeScriptがcn.tsで型エラーを報告する場合は、ClassValue型がclsxからインポートされているか確認してください。
ステップ5: ダークモードサポートの追加
tailwind.config.tsを更新します:
const config: Config = { darkMode: "class", // システム設定の場合は"media" // ... 残りの設定 };
トグルの実装:
"use client"; import { useEffect, useState } from "react"; export function ThemeToggle() { const [dark, setDark] = useState(false); useEffect(() => { document.documentElement.classList.toggle("dark", dark); }, [dark]); return ( <button onClick={() => setDark(!dark)}> {dark ? "Light" : "Dark"} Mode </button> ); }
期待結果: ダークモードがライトとダークテーマ間で正しく切り替わります。
darkクラスが<html>要素に適用され、dark:プレフィックス付きのユーティリティクラスが反応します。
失敗時: ダークモードが切り替わらない場合は、
tailwind.config.tsにdarkMode: "class"が設定されているか確認してください。darkクラスが<body>ではなく<html>要素に切り替えられていることを確認してください。システム設定モードの場合はdarkMode: "media"を使用してください。
ステップ6: プラグインの追加(オプション)
npm install -D @tailwindcss/typography @tailwindcss/forms
// tailwind.config.ts import typography from "@tailwindcss/typography"; import forms from "@tailwindcss/forms"; const config: Config = { // ... plugins: [typography, forms], };
期待結果: プラグインが開発依存関係としてインストールされ、
tailwind.config.tsのplugins配列に登録されています。プラグインが提供するクラス(typographyからのprose、formsからのスタイル付きフォーム要素など)がコンポーネントで使用可能です。
失敗時: プラグインクラスがレンダリングされない場合は、プラグインがインストールされ(
npm ls @tailwindcss/typography)、plugins配列に追加されているか確認してください。設定変更後は開発サーバーを再起動してください。
バリデーション
- Tailwindクラスがブラウザで正しくレンダリングされる
- カスタムテーマ値(色、フォント、スペーシング)が機能する
-
ユーティリティが競合なしにクラスをマージするcn() - ダークモードが正しく切り替わる
- TypeScriptが設定やコンポーネントでエラーを表示しない
- 本番ビルドで未使用のスタイルが削除される
よくある落とし穴
- コンテンツパスの欠落: クラスがレンダリングされない場合は、設定の
配列がファイルの場所と一致するか確認してくださいcontent - クラスの競合: 競合するユーティリティクラスを防ぐために
(tailwind-merge
経由)を使用してくださいcn() - カスタム値が機能しない: カスタム値が(デフォルトを置き換える)テーマルートではなく
の下にあることを確認してくださいextend - ダークモードが切り替わらない:
設定とdarkMode
クラスがdark
ではなく<body>
にあることを確認してください<html>
関連スキル
- Tailwind設定前のプロジェクトセットアップscaffold-nextjs-app
- スタイル付きアプリケーションのデプロイdeploy-to-vercel