원클릭으로
tailwind-to-figma
src/index.css の Tailwind CSS v4 @theme トークンを読み取り、型別に適切なコレクションへ整理して Figma ファイルに変数として書き出す。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
src/index.css の Tailwind CSS v4 @theme トークンを読み取り、型別に適切なコレクションへ整理して Figma ファイルに変数として書き出す。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Google の design.md 仕様に沿って DESIGN.md をプロジェクトルートに生成する。コードベース探索・Figma URL・既存 DESIGN.md URL の3つのソースモードに対応し、design.md リンターで検証する。
UIモックアップを作成するスキル。ユーザーが「モックアップを作りたい」「新しいページを作って」「UIデザインを実装したい」「サイトの画面を作りたい」「LP/トップページを作って」「デザインを実装して」などと言った場合は必ずこのスキルを使う。サイト種別・デザインテイスト・ページ種別の3つをヒアリングしてから、このプロジェクトのCLAUDE.md仕様に沿って実装する。Figma URLがない状態でUIを作る場合に特に有効。
Figma ファイル URL からすべての変数を読み取り、Tailwind CSS v4 の @theme トークンとして src/index.css に書き出す。
Tailwind CSS コードのレビュー・最適化・移行、および HTML アクセシビリティチェックを行うスキル。 以下の場合に必ず使用する: · Tailwind クラスを「レビューして」「きれいにして」「確認して」「見て」と依頼された場合 · `space-y-*`、`space-x-*`、`flex-shrink`、`shadow-sm`、`bg-opacity-*` などの v3 クラスが存在する場合 · `text-[#1e40af]` や `w-[320px]` のようなハードコードされた任意値が使われている場合 · 同一要素に `flex` と `block` など、競合・重複クラスが見つかった場合 · `cn()` / `clsx` の使用可否や `*:` バリアントへの統合を相談された場合 · v3 から v4 への移行・書き直しを依頼された場合 · `aria-label`、`ul/li`、`button type`、`label` など HTML アクセシビリティ構造の確認を依頼された場合 · Tailwind が使われている `.html`、`.tsx`、`.jsx`、`.vue`、`.astro` ファイルのレビューを依頼された場合 フレームワーク非依存(HTML / React / Vue / Svelte / Astro など)。 「クラスがなんかおかしい」「v4 にアップグレードしたらデザインが変わった」「CSS モジュールから移行したい」といった曖昧な依頼にも使用する。
ベースフォントサイズとスケール比率名(typescale.com 準拠)を選択して、 Tailwind CSS v4 プロジェクトに調和のとれたタイプスケールを適用する。 `@theme` に `--text-xs` ~ `--text-9xl` を設定し(Tailwind の全テキストサイズクラスに対応)、 `@layer base` で h1〜h6 のフォントサイズをマッピングする。 以下の場合に使用する: "タイプスケール変えたいんだけど"、 "フォントサイズを整えたい"、 "見出しのサイズをちゃんとしたい"、 "タイポグラフィのスケールを設定して"、 "apply a type scale"、"set up typography scale"、"change font sizes"
src/index.css の @theme ブロックからすべての CSS カスタムプロパティを読み取り、Figma 変数として書き出す。
出力言語: このスキルを呼び出したユーザーと同じ言語で応答する。
use_figma を呼び出す前に、必ず最初に figma-use スキルを読み込む:
/figma:figma-use
Read ツールで src/index.css を読み込み、@theme { ... } ブロック内のすべての CSS カスタムプロパティを抽出する。
| CSS 変数プレフィックス | カテゴリ | Figma コレクション | Figma 変数型 |
|---|---|---|---|
--color-* | カラー | Colors | COLOR |
--*-color-* | カラー | Colors | COLOR |
--*-font-family / --font-family-* / --default-font-family / --heading-font-family | フォントファミリー | Typography | STRING |
--font-*(文字列値) | フォントファミリー | Typography | STRING |
--text-*(数値/rem/px) | フォントサイズ | Typography | FLOAT |
--font-size-* | フォントサイズ | Typography | FLOAT |
--font-weight-* | フォントウェイト | Typography | FLOAT |
--spacing-* | スペーシング | Spacing | FLOAT |
--radius-* | 角丸 | Radius | FLOAT |
--border-*(数値) | ボーダー幅 | Border | FLOAT |
その他 --* | その他 | Other | 値によって決定 |
Figma の変数名はスラッシュ区切りのパス形式を使用する:
--color-primary → primary(Colors コレクション内)--color-brand-500 → brand/500--default-font-family → default(Typography コレクション内)--heading-font-family → heading--font-sans → sans--text-base → size/base(Typography コレクション内)--spacing-4 → 4(Spacing コレクション内)--radius-md → md(Radius コレクション内)プレフィックス(--color-、--spacing- など)を除去し、残りを変数名として使用する。
#rrggbb → { r: parseInt(rr,16)/255, g: parseInt(gg,16)/255, b: parseInt(bb,16)/255, a: 1 }#rrggbbaa → アルファ付きで変換rgba(r, g, b, a) → { r: r/255, g: g/255, b: b/255, a: a }rgb(r, g, b) → { r: r/255, g: g/255, b: b/255, a: 1 }"Font Name", fallback → "Font Name"(最初の引用符付きフォント名のみ抽出)FontName, fallback → "FontName"1rem → 16(px 換算のため × 16)0.5rem → 816px → 16(px を除去)0 → 01px → 1$ARGUMENTS に基づいて分岐する:
URL から fileKey を抽出する。whoami や create_new_file を呼び出す必要はない。
figma.com/design/:fileKey/... → :fileKey を取得?node-id= クエリパラメータは無視してよい抽出した fileKey を後続の use_figma 呼び出しで使用する。
最初に whoami を呼び出してプランの一覧を取得する:
key を planKey として使用するcreate_new_file で新規ファイルを作成する:
create_new_file({
fileName: "<引数の名前または "Design Tokens">",
planKey: "<whoami から取得した planKey>",
editorType: "design"
})
返された fileKey を後続の use_figma 呼び出しで使用する。
use_figma と Plugin API を使用して、コレクションと変数を一括で作成する。
変数が存在しないコレクションはスキップする — 少なくとも1つのトークンがあるカテゴリのみコレクションを作成する。
以下のコードを use_figma に渡す(tokenData には前のステップで抽出した実際の値を入力すること):
// ===== 実際のトークンデータ(ステップ 1〜2 で抽出した値を入力) =====
const tokenData = {
Colors: [
// 例: { name: "primary", type: "COLOR", value: { r: 0.173, g: 0.094, b: 0.063, a: 1 } }
],
Typography: [
// 例: { name: "default", type: "STRING", value: "Gen Interface JP" }
// 例: { name: "size/base", type: "FLOAT", value: 16 }
],
Spacing: [
// 例: { name: "4", type: "FLOAT", value: 16 }
],
Radius: [],
Border: [],
Other: [],
};
// =====================================================================
const results = [];
for (const [collectionName, variables] of Object.entries(tokenData)) {
if (variables.length === 0) continue;
const collections = await figma.variables.getLocalVariableCollectionsAsync();
let collection = collections.find(c => c.name === collectionName);
if (!collection) {
collection = figma.variables.createVariableCollection(collectionName);
}
const modeId = collection.defaultModeId;
for (const token of variables) {
const existingVars = await figma.variables.getLocalVariablesAsync();
let variable = existingVars.find(
v => v.variableCollectionId === collection.id && v.name === token.name
);
if (!variable) {
variable = figma.variables.createVariable(token.name, collection, token.type);
}
variable.setValueForMode(modeId, token.value);
results.push(`${collectionName}/${token.name} (${token.type})`);
}
}
return { created: results.length, variables: results };
tokenData に前のステップで抽出した実際の値を入力すること以下を報告する:
src/index.css が見つからない場合: ファイルパスをユーザーに確認する@theme ブロックが空の場合: 変数が定義されていないことを報告するcreate_new_file が失敗した場合: Figma のログイン状態を確認するようユーザーに案内する(whoami で確認可能)use_figma がエラーを返した場合: エラーの詳細を確認し、変数データのフォーマットを見直すvar(--other) 参照、linear-gradient など)は警告付きでスキップし、報告に含める