新規コンポーネント生成スキル
このスキルは、k8o プロジェクトの規約に従ったReactコンポーネントを生成します。
生成されるファイル
- コンポーネントファイル (
component-name.tsx) - kebab-case
- Storybookストーリー (
component-name.stories.tsx) - kebab-case
- エクスポートファイル (
index.ts) - コンポーネントのエクスポート用
プロジェクト規約
配置場所
- アプリ共通コンポーネント:
apps/main/src/app/_components/
- ページ固有コンポーネント:
apps/main/src/app/[page]/_components/
スタイリング
- TailwindCSS: ArteOdyssey (
@k8o/arte-odyssey/styles.css) で定義されたカスタムトークンのみ使用
- 禁止: 標準のTailwindクラス(
text-gray-600など)は使用禁止
利用可能なカスタムクラス例:
- テキスト色:
text-fg-base, text-fg-subtle, text-fg-mute, text-fg-info
- 背景色:
bg-bg-base, bg-bg-subtle, bg-bg-mute, bg-primary-bg
- ボーダー色:
border-border-base, border-border-subtle, border-primary-border
- フォントサイズ:
text-xs, text-sm, text-md(カスタム定義)
- Font Weight:
font-medium, font-bold(カスタム定義)
- Radius:
rounded-sm, rounded-md, rounded-lg(カスタム定義)
Storybook
- 必須: すべてのコンポーネントに
.stories.tsx が必要
- Import:
@storybook/nextjs-vite から Meta, StoryObj をimport
- Test:
storybook/test から fn, expect, userEvent などをimport(必要に応じて)
使用方法
基本的な使い方
ユーザーがコンポーネント名と配置場所を指定すると、このスキルが自動的に呼び出されます。
例:
「Buttonコンポーネントを apps/main/src/app/_components/ に作成して」
生成手順
ユーザーに確認:
- コンポーネント名(PascalCase)
- 配置パス(
apps/main/src/app/_components/ または apps/main/src/app/[page]/_components/)
- コンポーネントの用途・機能
- 実装レベル(新規追加):
- テンプレートのみ: 基本的なテンプレートのみ生成(TODOコメント付き)
- 具体的実装: ユーザーの要件に基づいて具体的な実装を含むコンポーネントを生成
テンプレートから生成:
templates/component.tsx.template からコンポーネントを生成
templates/component.stories.tsx.template からストーリーを生成
- プレースホルダーを置換:
{{COMPONENT_NAME}}: コンポーネント名(例: Button)
{{COMPONENT_PATH}}: コンポーネントへの相対パス(例: ./button)
{{DESCRIPTION}}: コンポーネントの説明
ファイルを作成:
{path}/{component-name}/{component-name}.tsx (kebab-case)
{path}/{component-name}/{component-name}.stories.tsx (kebab-case)
{path}/{component-name}/index.ts (kebab-case)
index.ts を生成:
- コンポーネントと型のエクスポートを含む index.ts を作成
- フォーマット:
export { ComponentName, type ComponentNameProps } from './component-name';
Storybook URLを提供:
mcp__storybook-mcp__get-story-urls ツールを使用してストーリーのURLを取得
- ユーザーに提供してブラウザで確認可能にする
テンプレート
コンポーネントテンプレート (templates/component.tsx.template)
基本的なReactコンポーネントのテンプレート:
- TypeScript + React
- Props型定義はFC内に直接記述(外部からclassNameを受け取らない設計)
- ArteOdysseyのUIコンポーネント活用
- TailwindCSSカスタムトークン使用
- 日本語コメント
- Next.js の Image コンポーネントを使用(img タグは禁止)
Storybookテンプレート (templates/component.stories.tsx.template)
Storybook 10の規約に従ったシンプルなストーリー:
@storybook/nextjs-vite からimport
- 基本的なDefaultストーリーのみ
- 必要に応じてストーリーを追加
index.ts テンプレート (templates/index.ts.template)
コンポーネントのエクスポート用:
- コンポーネント名のみをエクスポート
- 型は必要に応じてコンポーネントファイルからインポート
ArteOdysseyコンポーネント
再利用可能なUIコンポーネントは @k8o/arte-odyssey パッケージから利用可能:
import { Button } from '@k8o/arte-odyssey';
利用可能なコンポーネント例:
Button, IconButton
Input, Textarea, Select
Card, Dialog, Tooltip
Loading, ErrorBoundary
注意事項
- コメント: 日本語コメント推奨
- テスト: Storybookストーリーで基本的なインタラクションテストを記述
- アクセシビリティ: ArteOdysseyコンポーネントはアクセシビリティ対応済み
- スタイル: 標準のTailwindクラスは使用せず、必ずArteOdysseyのカスタムトークンを使用
- 画像: img タグは使用禁止。必ず Next.js の Image コンポーネント (
next/image) を使用
- ファイル構成: コンポーネントごとにディレクトリを作成し、その中に
.tsx, .stories.tsx, index.ts をまとめる
- 実装レベル: ユーザーに実装レベル(テンプレートのみ or 具体的実装)を確認してから生成する
例
使用例1: ボタンコンポーネント
「Buttonコンポーネントを apps/main/src/app/_components/ に作成して。
プライマリ、セカンダリ、危険の3つのバリアントを持つボタン」
使用例2: カード型コンポーネント
「BlogCardコンポーネントを apps/main/src/app/blog/_components/ に作成して。
タイトル、説明、タグ、公開日を表示するカード」
使用例3: フォームコンポーネント
「ContactFormコンポーネントを apps/main/src/app/contact/_components/ に作成して。
名前、メール、メッセージの入力フィールドと送信ボタン」
1---2name: new-component-23description: React コンポーネントとStorybookストーリーを生成。新しいコンポーネントを作成する際に使用。TailwindCSSカスタムトークン、ArteOdyssey UIライブラリを活用。4---5
6# 新規コンポーネント生成スキル
7
8このスキルは、k8o プロジェクトの規約に従ったReactコンポーネントを生成します。
9
10## 生成されるファイル
11
121. **コンポーネントファイル** (`component-name.tsx`) - kebab-case
132. **Storybookストーリー** (`component-name.stories.tsx`) - kebab-case
143. **エクスポートファイル** (`index.ts`) - コンポーネントのエクスポート用
15
16## プロジェクト規約
17
18### 配置場所
19
20- **アプリ共通コンポーネント**: `apps/main/src/app/_components/`
21- **ページ固有コンポーネント**: `apps/main/src/app/[page]/_components/`
22
23### スタイリング
24
25- **TailwindCSS**: ArteOdyssey (`@k8o/arte-odyssey/styles.css`) で定義されたカスタムトークンのみ使用
26- **禁止**: 標準のTailwindクラス(`text-gray-600`など)は使用禁止
27
28利用可能なカスタムクラス例:
29- テキスト色: `text-fg-base`, `text-fg-subtle`, `text-fg-mute`, `text-fg-info`
30- 背景色: `bg-bg-base`, `bg-bg-subtle`, `bg-bg-mute`, `bg-primary-bg`
31- ボーダー色: `border-border-base`, `border-border-subtle`, `border-primary-border`
32- フォントサイズ: `text-xs`, `text-sm`, `text-md`(カスタム定義)
33- Font Weight: `font-medium`, `font-bold`(カスタム定義)
34- Radius: `rounded-sm`, `rounded-md`, `rounded-lg`(カスタム定義)
35
36### Storybook
37
38- **必須**: すべてのコンポーネントに `.stories.tsx` が必要
39- **Import**: `@storybook/nextjs-vite` から `Meta`, `StoryObj` をimport
40- **Test**: `storybook/test` から `fn`, `expect`, `userEvent` などをimport(必要に応じて)
41
42## 使用方法
43
44### 基本的な使い方
45
46ユーザーがコンポーネント名と配置場所を指定すると、このスキルが自動的に呼び出されます。
47
48例:
49```
50「Buttonコンポーネントを apps/main/src/app/_components/ に作成して」
51```
52
53### 生成手順
54
551. **ユーザーに確認**:
56 - コンポーネント名(PascalCase)
57 - 配置パス(`apps/main/src/app/_components/` または `apps/main/src/app/[page]/_components/`)
58 - コンポーネントの用途・機能
59 - **実装レベル(新規追加)**:
60 - **テンプレートのみ**: 基本的なテンプレートのみ生成(TODOコメント付き)
61 - **具体的実装**: ユーザーの要件に基づいて具体的な実装を含むコンポーネントを生成
62
632. **テンプレートから生成**:
64 - `templates/component.tsx.template` からコンポーネントを生成
65 - `templates/component.stories.tsx.template` からストーリーを生成
66 - プレースホルダーを置換:
67 - `{{COMPONENT_NAME}}`: コンポーネント名(例: `Button`)
68 - `{{COMPONENT_PATH}}`: コンポーネントへの相対パス(例: `./button`)
69 - `{{DESCRIPTION}}`: コンポーネントの説明
70
713. **ファイルを作成**:
72 - `{path}/{component-name}/{component-name}.tsx` (kebab-case)
73 - `{path}/{component-name}/{component-name}.stories.tsx` (kebab-case)
74 - `{path}/{component-name}/index.ts` (kebab-case)
75
764. **index.ts を生成**:
77 - コンポーネントと型のエクスポートを含む index.ts を作成
78 - フォーマット: `export { ComponentName, type ComponentNameProps } from './component-name';`
79
805. **Storybook URLを提供**:
81 - `mcp__storybook-mcp__get-story-urls` ツールを使用してストーリーのURLを取得
82 - ユーザーに提供してブラウザで確認可能にする
83
84## テンプレート
85
86### コンポーネントテンプレート (`templates/component.tsx.template`)
87
88基本的なReactコンポーネントのテンプレート:
89- TypeScript + React
90- Props型定義はFC内に直接記述(外部からclassNameを受け取らない設計)
91- ArteOdysseyのUIコンポーネント活用
92- TailwindCSSカスタムトークン使用
93- 日本語コメント
94- Next.js の Image コンポーネントを使用(img タグは禁止)
95
96### Storybookテンプレート (`templates/component.stories.tsx.template`)
97
98Storybook 10の規約に従ったシンプルなストーリー:
99- `@storybook/nextjs-vite` からimport
100- 基本的なDefaultストーリーのみ
101- 必要に応じてストーリーを追加
102
103### index.ts テンプレート (`templates/index.ts.template`)
104
105コンポーネントのエクスポート用:
106- コンポーネント名のみをエクスポート
107- 型は必要に応じてコンポーネントファイルからインポート
108
109## ArteOdysseyコンポーネント
110
111再利用可能なUIコンポーネントは `@k8o/arte-odyssey` パッケージから利用可能:
112
113```typescript
114import { Button } from '@k8o/arte-odyssey';
115```
116
117利用可能なコンポーネント例:
118- `Button`, `IconButton`
119- `Input`, `Textarea`, `Select`
120- `Card`, `Dialog`, `Tooltip`
121- `Loading`, `ErrorBoundary`
122
123## 注意事項
124
125- **コメント**: 日本語コメント推奨
126- **テスト**: Storybookストーリーで基本的なインタラクションテストを記述
127- **アクセシビリティ**: ArteOdysseyコンポーネントはアクセシビリティ対応済み
128- **スタイル**: 標準のTailwindクラスは使用せず、必ずArteOdysseyのカスタムトークンを使用
129- **画像**: img タグは使用禁止。必ず Next.js の Image コンポーネント (`next/image`) を使用
130- **ファイル構成**: コンポーネントごとにディレクトリを作成し、その中に `.tsx`, `.stories.tsx`, `index.ts` をまとめる
131- **実装レベル**: ユーザーに実装レベル(テンプレートのみ or 具体的実装)を確認してから生成する
132
133## 例
134
135### 使用例1: ボタンコンポーネント
136
137```
138「Buttonコンポーネントを apps/main/src/app/_components/ に作成して。
139プライマリ、セカンダリ、危険の3つのバリアントを持つボタン」
140```
141
142### 使用例2: カード型コンポーネント
143
144```
145「BlogCardコンポーネントを apps/main/src/app/blog/_components/ に作成して。
146タイトル、説明、タグ、公開日を表示するカード」
147```
148
149### 使用例3: フォームコンポーネント
150
151```
152「ContactFormコンポーネントを apps/main/src/app/contact/_components/ に作成して。
153名前、メール、メッセージの入力フィールドと送信ボタン」
154```