frontend-dev について
Next.js と React のフロントエンド開発向けコーディングスキルで、ページ、コンポーネント、Tailwind CSS、API 連携、hooks、i18n を扱います。Swiss International Style、リポジトリの規約、コミット前の確認を重視します。
主な機能
- 01作業前に読むドキュメントと既存コンポーネントの確認手順
- 02Swiss スタイルの色、書体、影の規定
- 03コンポーネント、textarea、API 連携のパターン
- 04アイコンの直接インポートと動的読み込みの指針
- 05lint、format、UI 確認のチェックリスト
活用シーン
- 01プロジェクト規約に沿った React コンポーネントの作成・変更
- 02Next.js ページでの API 連携と並列リクエスト
- 03UI スタイルとコミット前の要件確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ srbhr/ resume-matcher --skill frontend-devインストール後、Claude Code で/frontend-devを入力して読み込まれたか確認します。
詳細
フロントエンド開発
Next.js のページ、React コンポーネント、Tailwind CSS のスタイル、API 連携、フック、i18n を作成または変更する場合に使用します。
コードを書く前に
- ユーザーフローについて、
docs/agent/architecture/frontend-workflow.mdを読みます - スイス・インターナショナル・スタイルについて、
docs/agent/design/style-guide.mdを読みます(必須) - 規約について、
docs/agent/coding-standards.mdを読みます apps/frontend/components/にある既存のコンポーネントを確認します
必ず守るルール
- スイス・インターナショナル・スタイル - UI の変更にはすべて適用します
- あらゆる場所で
rounded-noneを使います - 角を丸くすることは一切禁止です - ハードシャドウ -
shadow-[4px_4px_0px_0px_#000000]を使い、ソフトシャドウは使いません - コミット前に
npm run lintを実行します - コミット前に
npm run formatを実行します - すべてのテキストエリアで Enter キーを処理します
スイス・インターナショナル・スタイル早見表
| 要素 | 値 |
|---|---|
| キャンバスの背景 | #F0F0E8 / bg-[#F0F0E8] |
| インクのテキスト | #000000 |
| ハイパーブルー | #1D4ED8 / text-blue-700 |
| シグナルグリーン | #15803D / text-green-700 |
| アラートレッド | #DC2626 / text-red-600 |
| 見出し | font-serif |
| 本文 | font-sans |
| ラベル | font-mono text-sm uppercase tracking-wider |
| 罫線 | rounded-none border-2 border-black |
| シャドウ | shadow-[4px_4px_0px_0px_#000000] |
| ホバー | hover:translate-y-[1px] hover:translate-x-[1px] hover:shadow-none |
アンチパターン(絶対に使用しない)
rounded-none以外のrounded-*- グラデーションやぼかしシャドウ
- パレットにない色
- パステルカラーや柔らかい色
- 機能のない装飾用アイコン
パターン
新しいコンポーネント
'use client';
interface MyComponentProps {
title: string;
onAction: () => void;
}
export function MyComponent({ title, onAction }: MyComponentProps) {
return (
<div className="bg-white border-2 border-black shadow-[4px_4px_0px_0px_#000000] p-6">
<h3 className="font-serif text-xl mb-4">{title}</h3>
<button
onClick={onAction}
className="rounded-none border-2 border-black px-4 py-2 bg-blue-700 text-white shadow-[2px_2px_0px_0px_#000000] hover:translate-y-[1px] hover:translate-x-[1px] hover:shadow-none transition-all"
>
Action
</button>
</div>
);
}
テキストエリア(Enter キーの修正)
const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {
if (e.key === 'Enter') e.stopPropagation();
};
<textarea onKeyDown={handleKeyDown} className="w-full rounded-none border-2 border-black p-3 font-sans" />
バンドルの最適化
// Direct icon import (NOT barrel import)
import FileText from 'lucide-react/dist/esm/icons/file-text';
// Dynamic import for heavy components
import dynamic from 'next/dynamic';
const PDFViewer = dynamic(() => import('./PDFViewer'), { ssr: false });
API 連携
// Use Promise.all for independent fetches
const [resumes, jobs] = await Promise.all([
api.get('/api/v1/resumes'),
api.get('/api/v1/jobs'),
]);
チェックリスト
-
npm run lintが成功する -
npm run formatを実行した - すべての要素に
rounded-noneを適用した - ハードシャドウのみを使い、スイスのパレットに限定した
- タイポグラフィが適切(見出しはセリフ体、ラベルは等幅フォント、本文はサンセリフ体)
- テキストエリアに Enter キーのハンドラーがある
- アイコンを直接インポートし、重いコンポーネントには
next/dynamicを使う - 独立したフェッチには
Promise.all()を使う
コメント
Markdown 対応