mcpField
C
converting-css-modules-to-tailwind

converting-css-modules-to-tailwind

github.com/revitalb-portデザイン・UI061 回インストール10 週間前に更新
リポジトリ

converting-css-modules-to-tailwind について

CSS Modules を Tailwind のユーティリティクラスへ移行する手順を、コンポーネント単位で示すスキルです。条件付きクラスや SCSS の扱い、移行後の整理と表示確認も扱います。

主な機能

  1. 01モジュールクラスと CSS ルールの対応付け
  2. 02スタイルの Tailwind クラスへの変換
  3. 03条件付き・動的クラスの処理
  4. 04SCSS とグローバル上書きへの対応
  5. 05モジュール削除と変更の検証

活用シーン

  1. 01コンポーネント単位での CSS Modules 移行
  2. 02clsx を使う条件付きスタイルの変換
  3. 03SCSS 変数やネストの置き換え
  4. 04移行後のスタイル回帰の確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/revitalb-port/skills-registry-demo --skill converting-css-modules-to-tailwind

インストール後、Claude Code で/converting-css-modules-to-tailwindを入力して読み込まれたか確認します。

詳細

CSS Modules を Tailwind に変換する

コンポーネントを CSS Modules(.module.css / .module.scss)から Tailwind のユーティリティクラスに移行します。

ワークフロー

1. モジュールを調査する

.module.css ファイルと、それをインポートしているコンポーネントを読みます。すべての styles.xxx 参照を、対応する CSS ルールに関連付けます。

// Before
import styles from './Card.module.css';
<div className={styles.card}>
  <h2 className={styles.title}>{title}</h2>
  <p className={styles.body}>{children}</p>
</div>
/* Card.module.css */
.card { display: flex; flex-direction: column; gap: 16px; padding: 24px; border-radius: 12px; background: white; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
.title { font-size: 20px; font-weight: 600; color: #111827; }
.body { font-size: 14px; color: #6b7280; line-height: 1.6; }
2. 各クラスを変換する

styles.xxx を同等の Tailwind ユーティリティに置き換えます。

// After
<div className="flex flex-col gap-4 p-6 rounded-xl bg-white shadow-sm">
  <h2 className="text-xl font-semibold text-gray-900">{title}</h2>
  <p className="text-sm text-gray-500 leading-relaxed">{children}</p>
</div>
3. CSS Modules のパターンに対処する

composes キーワード:

.base { padding: 8px 16px; border-radius: 4px; }
.primary { composes: base; background: blue; color: white; }

→ 1 つのユーティリティセットにまとめます。再利用が必要な場合は、クラスではなくコンポーネントを抽出します。

clsx / classnames を使った条件付き className:

// Before
className={clsx(styles.button, isActive && styles.active)}
// After
className={clsx("px-4 py-2 rounded", isActive && "bg-blue-600 text-white")}

動的なクラス選択:

// Before
className={styles[variant]}
// After — use a lookup object
const variantClasses = {
  primary: "bg-blue-600 text-white hover:bg-blue-700",
  secondary: "bg-gray-100 text-gray-900 hover:bg-gray-200",
  danger: "bg-red-600 text-white hover:bg-red-700",
};
className={variantClasses[variant]}

CSS Modules のグローバルなオーバーライド:

:global(.some-library-class) { ... }

→ @layer components { } を使って globals.css に移すか、グローバルスタイルシートで Tailwind の @apply を使います。

SCSS の機能(ネスト、変数、ミックスイン):

  • ネストされたセレクター → 各要素のユーティリティクラスに展開します
  • SCSS の $variables → tailwind.config.ts のテーマ値に対応付けます
  • ミックスイン → ユーティリティの組み合わせに置き換えるか、コンポーネントを抽出します
4. クリーンアップする
  1. import styles from './Xxx.module.css' の行を削除します
  2. .module.css / .module.scss ファイルを削除します
  3. コンポーネントと同じ場所にある index.ts のバレルファイルがスタイルを再エクスポートしていた場合は、更新します
  4. 削除したモジュールをインポートしている箇所がほかにないか、コードベースを検索します
  5. アプリを実行して視覚的に確認し、リグレッションがないか確認します

ルール

  • コンポーネントは一度に 1 つずつ変換します。ディレクトリ全体をまとめて変換しないでください
  • 条件付きロジックは CSS ではなく、clsx() またはテンプレートリテラルに記述します
  • モジュールに疑似要素のスタイル(content を伴う :before、:after)がある場合は、Tailwind で before: / after: プレフィックスと content-['...'] が必要です
  • :nth-child、:first-of-type などについては、Tailwind に対応するバリアントがあるか確認し、なければ最小限の CSS ルールを残します
  • モジュールの動作を再現するために @apply クラスを作成しないでください。目的は間接性をなくすことです

コメント