Communitygithub.com

アイコン作成スキル

オリジナルのSVG UIアイコンをデザインし、一貫性のあるアイコンセットとして出荷します。24pxグリッドに基づき、プロの設計ルールに従って描画、リント、最適化し、PNGプレビューを生成。React、Vue、Svelte、またはHTMLスプライトコンポーネントとして、アクセシブルなデフォルト設定で出力します。

アイコン作成スキル とは?

このスキルは、開発者がアプリケーションに必要なカスタムSVGアイコンを設計・生成するための包括的なワークフローを提供します。ユーザーがサイドバー、ナビゲーションバー、ダッシュボード、設定画面などで使用するアイコンを要求した場合に、独自のアイコンセットを作成します。既存のアイコンライブラリ(例:Lucide)をインストールするのではなく、常に新しいアイコンをゼロから描画するため、バンドルサイズを抑え、統一感のあるルック・アンド・フィールを実現します。スキルは、プロジェクトのフレームワーク検出、既存アイコンのスタイルマッチング、24pxグリッド上での描画、リント、SVGOによる最適化、PNGプレビューの生成、そしてReact/Vue/Svelte/HTMLスプライト用のツリーシェイカブルなコンポーネント出力までを自動化します。アクセシビリティもデフォルトで考慮され、アイコンは`aria-hidden`属性で装飾的要素として扱われ、アイコンのみのボタンには`aria-label`が付与されるなど、Web標準に準拠した実装が可能です。ロゴ、ブランドマーク、ファビコンなどのデザインには使用すべきではありません。

対応✓Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/Abhijit-Jha/icon-skill/tree/HEAD/icon-forge

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

Icon Forge(アイコンフォージ)

プロフェッショナルなセットから提供されたかのようなカスタムアイコンを描画し、ランタイム依存関係なしで出荷します。すべてのアイコンがリントに合格し、あなたが 16/20/24pxのプレビューを確認し、明るい/暗い背景でも明確かつ一貫して認識でき、生成されたコンポーネントがアクセシブルな使い方で組み込まれた時点で完了です。

<skill> は、このファイルが含まれているフォルダ(例:.claude/skills/icon-forge、.cursor/skills/icon-forge、.agents/skills/icon-forge)を示します。スクリプトはNode ≥18が必要で、プロジェクトの依存関係は必要ありません。

使用する場合 / 使用しない場合

  • 使用する場合: サイドバー、ナビバー、ダッシュボード、設定ページ、空の状態、ツールバーにアイコンが必要な場合、ユーザーがカスタムまたは不足しているアイコンを要求した場合、ユーザーが絵文字/プレースホルダーアイコンや重いアイコンパッケージを小さな独自セットに置き換えたい場合。
  • 使用しない場合: ロゴやブランドマーク(商標;デザイナーが必要)、ファビコン/アプリアイコン、イラストやスポットアート、写真/ラスター、アニメーションLottie。ユーザーが明示的にライブラリのインストールを要求した場合(例:「Lucideを使って」)、その指示に従ってください。このスキルはカスタムパスのために存在します。

厳格なルール(とその理由)

  1. すべてのアイコンを自分で描画し、アイコンライブラリの依存関係を追加しないでください。 ユーザーはバンドルサイズとユニークな見た目のために独自のアイコンを選択しました。Lucide、Heroicons、Materialなどからパスデータを貼り付けないでください(ライセンスとオリジナリティの問題)。開始ジオメトリとして references/glyph-cookbook.md(オリジナル描画)を使用してください。
  2. プロジェクトがすでにアイコンライブラリを使用している場合、そのグリッド、ストローク、キャップ、半径に合わせてください(scripts/detect.mjs と design-rules §10 を参照)。新しいアイコンは、既存のアイコンの隣に違和感なく配置される必要があります。
  3. 1つのセット、1つのスタイル。 すべてのアイコンで同じグリッド、ストローク幅、キャップ/ジョイン、半径スケール、パディング、詳細レベル。一貫性は、どんな単一の優れたアイコンよりも重要です。
  4. プレゼンテーション属性はルートの <svg> のみに配置し、色は currentColor とし、ソースに id、スタイル、クラス、変換、<g> を含めないでください。 そうしないと、テーマ設定、ダークモード、strokeWidth プロパティ、インライン化が機能しません。
  5. アイコンをレンダリングしてPNGを表示せずに、良いと主張しないでください。 コード上では正しく見えるジオメトリでも、16pxではブロブ、閉じたギャップ、中心からずれた形状、ミスマッチな太さが頻繁に発生します。
  6. スクリプトを実行し、再実装しないでください。 リント、最適化、プレビュー、コード生成は決定論的です。生成されたファイルを手動で編集しないでください。icons/src/ を変更して再構築してください。
  7. ユーザーの依存関係を変更しないでください。 プレビューツールは ~/.cache/icon-forge にインストールされます(--install)。SVGOは存在しない場合 npx 経由で実行されます。プロジェクトにパッケージを追加する前に許可を求めてください。
  8. デフォルトでアクセシブルに。 アイコンはラベル付けされていない限り aria-hidden とします。アイコンのみのコントロールには aria-label を付けます。インタラクティブなターゲットは ≥44px とします。意味のあるアイコンは ≥3:1 のコントラストを確保します。

ワークフロー

1. スタックと既存のスタイルを検出

node <skill>/scripts/detect.mjs .

フレームワーク、TypeScript、Tailwind、アイコンライブラリ(とそのスタイルプリセット)、ローカルのSVGアイコン、推奨される出力ディレクトリを確認します。既存のセットがある場合は、そのSVGを2~3つ開き、ルートの数値をコピーします。それ以外の場合はデフォルト(24グリッド、ストローク2、ラウンドキャップ/ジョイン)を使用します。

2. リストを計画:意味 → メタファー → ファイル名

描画前に短いテーブルを書きます:ラベル | メタファー(描画するもの) | ファイル名 | クックブックの開始点。例:Projects | カンバンボード | kanban.svg | kanban。主流のメタファー(design-rules §7)を選択し、1つの意味に1つのメタファーを使用します。ファイル名はオブジェクトを表すケバブケースで命名します。ラベルが曖昧で、選択がUIの意味を変える場合のみユーザーに尋ね、それ以外は決定して選択を伝えます。

3. 24グリッド上に描画

icons/src/<name>.svg を作成し、正規のルート(svg-code-rules.md)を使用します。各アイコンについて:

  • 対応するキーラインから開始します:円 r10、正方形 18(x/y 3)、縦長 16×20、横長 20×16。キーラインはストロークの中心線です。
  • ストロークの外側のエッジをキャンバスエッジから 1 単位以上離します。大きなコーナーには半径 2、小さなコーナーには 1~1.5 を使用します。ギャップは 2 単位以上のクリアスペースを確保します。
  • パーツは正確に結合するか、明確なギャップを保ちます。2pxストロークには整数座標を使用します。要素はできるだけ少なくします(通常 ≤6)。
  • 最も近い references/glyph-cookbook.md エントリから開始し、適応させます。グリフがそのまま適合する場合は、<skill>/assets/cookbook/<name>.svg からジオメトリをコピーします。
  • 繰り返しジオメトリ(歯、光線、星のポイント)は、推測する代わりに数行のJSで計算します。 最初にセット全体を描画し、その後リファインします。一貫性は並べて判断します。

4. リント

node <skill>/scripts/lint.mjs icons/src

すべての ✖ を修正します。⚠ gap、density、scale、bounds はノイズではなく、修正すべき設計問題として扱います。各 ℹ gap に注意し、ステップ6で確認します。密接した平行ストローク(バー、線)は、4単位離れていないと16pxでにじみます。正当化できない警告がなくなるまで再実行します。フラグ:--grid、--padding、--mode fill、--strict、--json。

5. 最適化

node <skill>/scripts/optimize.mjs icons/src icons/svg

これにより数値が丸められ、SVGOが実行され(ローカルインストールまたは npx svgo@4;オフラインでは組み込みの正規化ツールにフォールバック)、ルート属性が並べ替えられ、アイコンごとのバイト数と総gzipサイズが表示されます。出力もリントします:node <skill>/scripts/lint.mjs icons/svg。

6. プレビューして確認、そして反復

node <skill>/scripts/preview.mjs icons/svg --out icons/preview.png \
  --sidebar "dashboard:Dashboard,kanban:Projects" --active dashboard   # PNGエンジンがない場合は最初に --install を追加

画像ビューワでPNGをこの順序で表示します:

  1. icons/[email protected]:セットストリップとサイドバーモック。詳細を完全に確認できる十分なサイズです。
  2. icons/[email protected]:各サイズのすべてのアイコンと、インスペクトビュー。縦長なので、ビューワが縮小する場合はトリミングします。
  3. icons/preview.png:実際の1×ピクセル。

これらはまとめて以下を表示します:

  • 明るい/暗い背景での24/16pxストリップ。
  • アクティブアイテムと折りたたまれたレールを備えたサイドバーモック。
  • 16/20/24/48pxでのアイコンごとの行。
  • グリッド、青色のキーライン、赤色の1pxパディング制限を備えた4×インスペクトビュー。

design-rules §12 のセルフレビューの質問に答えます。典型的な修正:

確認した内容修正方法
1つのアイコンがストリップ内で薄く/小さく見えるキーラインまで拡大するか、フレーム/軸を追加する(開いたグリフは軽く見える)
1つが重く/込み入って見える詳細を削除する;バー ≤3、歯 ≤6、テキスト行 ≤2
16pxでパーツの接合部ににじみがある正確に結合するか、ギャップを 2 単位以上開ける
インスペクトビューで形状が片側に寄っている中央に再配置するか、光学的バランスのために 0.5~1 単位移動する
折りたたまれたレールでメタファーが不明瞭より文字通りのメタファーを選択する(ステップ2)

修正すべき点が見つからなくなるまで、ステップ3~6を繰り返します。通常1~3ラウンドです。

7. フレームワーク出力を生成

node <skill>/scripts/build.mjs icons/svg --out src/components/icons --framework react --lang ts \
  --labels "kanban:Projects,dashboard:Dashboard"

--framework react|vue|svelte|html|all;--lang ts|js;--package @app/icons は sideEffects:false の package.json を書き出します。出力は、アイコンごとに1つのツリーシェイカブルなモジュール、共有ベースコンポーネント(size、color、strokeWidth、absoluteStrokeWidth、title、className)、index 名前付きエクスポート、icons.json です。HTML は sprite.svg + usage.html を提供します。詳細:references/output-formats.md。

次に、プロジェクトにスクリプトがある場合は型チェックまたはビルドを行い(npx tsc --noEmit、npm run build)、エラーを修正します。

8. アクセシブルな使い方で組み込む

references/accessibility-and-usage.md のパターンを使用します:

  • <nav aria-label>;アクティブアイテムには aria-current="page" と色・背景を設定。
  • アイコンは size-5 shrink-0 で装飾的。
  • アイコンのみのボタンには aria-label;ログアウトは <button> として。
  • ≥44pxの行;3:1に到達するミュートカラー。

出力フォーマット

ユーザーへの短いレポートで締めくくります:

  1. アイコン: テーブル ラベル → コンポーネント → メタファー とフォルダパス(icons/src、icons/svg、生成ディレクトリ)。
  2. チェック: リント結果(エラー/警告)、最適化の合計(avg B/icon、gzip total)、調査したプレビューパス、および確認後に変更した内容。
  3. 使用スニペット 対象フレームワーク用、a11y属性付き。
  4. 注意事項: スタイルの決定(マッチしたグリッド/ストローク/プリセット)、ミラーリングするRTLアイコン、および確認できなかった内容。

例

ユーザー:「Next.js + Tailwind アプリに Dashboard、Projects、Team、Settings のサイドバーアイコンが必要。」 → detect:React(Next)+ TS + Tailwind、アイコンライブラリなし → 計画:dashboard/tiles、kanban、users、settings/gear → クックブックから描画して適応 → lint PASS → 最適化:4アイコン、平均 ~340 B、~0.4 KB gzip → プレビュー:Projectsが薄く見えたので、バーを追加;再チェック → --framework react で src/components/icons にビルド → <DashboardIcon className="size-5 shrink-0" /> を aria-current 付きでナビゲーションに配置。

参考文献

必要なときに開く…読むもの
サイズ、キーライン、半径、ギャップ、メタファーの選択、またはプレビューの問題の修正references/design-rules.md
SVGマークアップの作成やデバッグ、リントエラーの理解references/svg-code-rules.md
一般的なUIアイコンの実績あるジオメトリから開始(56の描画済みグリフ)references/glyph-cookbook.md + assets/cookbook/*.svg
React/Vue/Svelte/Angular/HTML出力の生成または手動適応、バンドルサイズの削減references/output-formats.md
使用スニペットの作成:ナビゲーション/サイドバーパターン、アクティブ状態、ラベル、コントラスト、RTLreferences/accessibility-and-usage.md
生成コンポーネントの形状変更(プロパティ、クラス名、a11yデフォルト)templates/<framework>/、build.mjsが読み取る場所。出力ではなく、そこで編集
このスキルの変更テストevals/evals.json

検証チェックリスト(完了と報告する前にすべてが真でなければなりません)

  • アイコンライブラリが追加されていない。すべてのアイコンはこのタスクのために描画されるか、クックブックから適応された。
  • スタイルがプロジェクトの既存アイコン(またはデフォルトプリセット)とセット全体で一致している。
  • lint.mjs が icons/src と icons/svg で PASS。残りの警告はレポートで正当化されている。
  • 最後の変更後にプレビューPNGを確認した。16pxの明るい/暗い行がクリーン。どのアイコンも兄弟よりも重く、軽く、または大きくない。
  • コンポーネントが build.mjs によって生成され、プロジェクトの型チェック/ビルドが(利用可能な場合)パスした。
  • 使用方法:装飾アイコンは非表示、アイコンのみのコントロールはラベル付き、アクティブ状態は色だけでない、ターゲット ≥44px、コントラスト ≥3:1。
  • レポートにサイズ(平均バイト/アイコン、gzip合計)とプレビューパスが含まれている。

関連スキル