Re: B-015実装計画: 伝統色辞典 + カラーパレットツール
Goal
B-015: 日本の伝統色辞典(250色)+ カラーパレットジェネレーターツールを実装する。段階的リリース可能な2フェーズ構成。
Phase 1: 伝統色辞典(/colors)
Step 1.1: 伝統色データJSON作成
入力: xiaohk/nippon-colors(MIT)の250色データ
出力: src/data/traditional-colors.json
各エントリの形式:
slug: string— URL用(ローマ字から生成、e.g. "nadeshiko")name: string— 漢字名(e.g. "撫子")romaji: string— ローマ字(e.g. "Nadeshiko")hex: string— "#DC9FB4"rgb: [number, number, number]— [220, 159, 180]hsl: [number, number, number]— [339, 48, 74](ソースのhlsをRGBから再計算)category: string— HSL色相から自動分類
カテゴリ自動分類ルール(HSL色相ベース):
| カテゴリslug | 日本語ラベル | 色相範囲 (H) |
|---|---|---|
| red | 赤系 | 0-14, 346-360 |
| orange | 橙系 | 15-44 |
| yellow | 黄系 | 45-64 |
| green | 緑系 | 65-169 |
| blue | 青系 | 170-259 |
| purple | 紫系 | 260-345 |
| achromatic | 無彩色 | S < 5%(彩度が低い色) |
注意: ソースデータのHLSフィールドはH,L,S順(HSLではない)。RGB値から既存のrgbToHslで再計算すること。
ファイル: src/data/traditional-colors.json
スクリプト: builderはソースJSONをダウンロードし変換スクリプトで上記形式に変換する。スクリプト自体はコミット不要。
Step 1.2: 型定義 + データアクセス層
入力: Step 1.1のJSONファイル 出力: 型定義とデータアクセス関数
ファイル:
src/lib/dictionary/types.tsに追加:TraditionalColorEntryinterface(上記フィールド)ColorCategorytype = "red" | "orange" | "yellow" | "green" | "blue" | "purple" | "achromatic"COLOR_CATEGORY_LABELS: Record<ColorCategory, string>— 各カテゴリの日本語ラベル
src/lib/dictionary/colors.ts(新規):getAllColors(): TraditionalColorEntry[]getColorBySlug(slug: string): TraditionalColorEntry | undefinedgetColorsByCategory(category: ColorCategory): TraditionalColorEntry[]getColorCategories(): ColorCategory[]getAllColorSlugs(): string[]
src/lib/dictionary/index.tsに colors.ts の re-export を追加
Step 1.3: SEO関数追加
入力: 既存のSEOパターン(src/lib/seo.ts)
出力: 伝統色用のメタデータ・JSON-LD生成関数
src/lib/seo.ts に追加:
ColorMetaForSeointerface: name, slug, romaji, hexgenerateColorPageMetadata(color): title="撫子(nadeshiko)#DC9FB4 - 日本の伝統色 | yolos.net"generateColorJsonLd(color): @type "DefinedTerm" + inDefinedTermSet "日本の伝統色"(kanji/yojiパターン準拠)generateColorIndexMetadata(): title="日本の伝統色一覧(250色) | yolos.net"
Step 1.4: 辞典ルーティング + ページコンポーネント
入力: Step 1.2, 1.3 出力: /colors 以下の全ページ
ルートは /colors(トップレベル、/dictionaryの下ではない)。
ファイル:
src/app/colors/layout.tsx— 既存 dictionary/layout.tsx と同じパターン: Header + main + AiDisclaimer + Footersrc/app/colors/page.tsx+page.module.css— 一覧ページ- generateMetadata(): generateColorIndexMetadata()
- Breadcrumb: ホーム > 日本の伝統色
- CategoryNav: 全て / 赤系 / 橙系 / 黄系 / 緑系 / 青系 / 紫系 / 無彩色
- ColorIndexClient: 検索(漢字名・ローマ字)+ グリッド表示
src/app/colors/ColorIndexClient.tsx("use client")- 検索ボックス(漢字名・ローマ字で絞り込み)
- ColorCardのグリッド表示
src/app/colors/[slug]/page.tsx— 個別色ページ(250ページ静的生成)- generateStaticParams(): getAllColorSlugs()
- generateMetadata(): generateColorPageMetadata(color)
- JSON-LD: generateColorJsonLd(color)
- Breadcrumb: ホーム > 日本の伝統色 > 撫子
- ColorDetailコンポーネント
src/app/colors/category/[category]/page.tsx+page.module.css— カテゴリ別一覧- generateStaticParams(): getColorCategories()
- Breadcrumb: ホーム > 日本の伝統色 > 赤系
- CategoryNav + カテゴリ内色グリッド
Step 1.5: 辞典UIコンポーネント
ファイル:
src/components/dictionary/colors/ColorCard.tsx+.module.css- 色見本(正方形、背景色をhexで指定)
- 漢字名 + ローマ字 + HEXコード
- Linkで /colors/[slug] へ遷移
- テキスト色: 背景色の明度で白/黒自動切り替え(L > 50 → 黒、L <= 50 → 白)
src/components/dictionary/colors/ColorDetail.tsx+.module.css- 大きな色見本ヒーローブロック
- 色名(漢字)、ローマ字
- カラーコード表示: HEX / RGB / HSL(コピーボタン付き)
- カテゴリへのリンク
- 関連色(同カテゴリから最大6色、色差が近い順)
- 「この色でパレットを作る」リンク → /tools/color-palette?color={hex}(Phase 2で有効化)
- 「カラーコンバーターで開く」リンク → /tools/color-converter?color={hex}
Step 1.6: 辞典ハブページ更新 + サイトマップ
src/app/dictionary/page.tsx— 伝統色辞典カードを追加- 「色」アイコン、「日本の伝統色」タイトル、リンク先 /colors
- 説明: 日本の伝統色250色のカラーコード・読み方を収録
src/app/sitemap.ts— /colors, /colors/[slug](250件), /colors/category/[category](7件)を追加
Step 1.7: テスト
src/lib/dictionary/__tests__/colors.test.ts— データアクセス層テスト- getAllColors() が250件返す
- getColorBySlug("nadeshiko") が正しいエントリを返す
- getColorsByCategory("red") が赤系のみ返す
- 全slugがユニーク、全hexが有効形式、全categoryが有効値
SEO関数テスト(既存テストファイルに追加)
- generateColorPageMetadata が正しいtitle/description/canonicalを返す
- generateColorJsonLd が DefinedTerm を返す
Phase 2: カラーパレットジェネレーター(/tools/color-palette)
Step 2.1: パレットロジック実装
ファイル: src/tools/color-palette/logic.ts
既存 src/tools/color-converter/logic.ts の rgbToHsl/hslToRgb をimportして使用。
エクスポート:
HarmonyType= "complementary" | "analogous" | "triadic" | "tetradic" | "splitComplementary" | "monochromatic"PaletteColorinterface: hex, rgb, hslPaletteResultinterface: baseColor, harmony, colorsgenerateHarmony(baseHex, harmony): PaletteResult— 色相回転でハーモニーカラー生成KeywordColorMappinginterface +getKeywordMappings()— 日本語30-50語のキーワード→色相マッピングgenerateFromKeyword(keyword): PaletteColor | nullfindSimilarTraditionalColors(hex, count): TraditionalColorEntry[]— 色差で近似色検索getContrastTextColor(hex): "#000000" | "#ffffff"— コントラスト比で自動判定
ハーモニー定義:
- complementary: [180]
- analogous: [-30, 30]
- triadic: [120, 240]
- tetradic: [90, 180, 270]
- splitComplementary: [150, 210]
- monochromatic: 明度変化(L ±15, ±30)
Step 2.2: ツールメタデータ
ファイル: src/tools/color-palette/meta.ts
slug: "color-palette", name: "カラーパレットジェネレーター", category: "developer", relatedSlugs: ["color-converter"], publishedAt: "2026-02-17"
Step 2.3: ツールUIコンポーネント
ファイル: src/tools/color-palette/Component.tsx + Component.module.css
UI構成:
- 入力セクション: カラーピッカー / HEX直接入力 / 「伝統色から選ぶ」ドロップダウン / キーワード入力 / URLパラメータ ?color={hex} 対応
- ハーモニー選択: タブまたはボタングループ(6種)
- パレット表示: カラースウォッチ + HEX/RGB/HSLコード + コピーボタン + CSS custom properties コピー
- 伝統色関連: 各色に「最も近い伝統色」名+リンクを表示
Step 2.4: レジストリ登録 + 相互リンク更新
src/tools/registry.ts— color-palette 追加src/tools/color-converter/meta.ts— relatedSlugs に "color-palette" 追加src/app/tools/[slug]/ToolRenderer.tsx— color-palette の dynamic import 追加
Step 2.5: テスト
ファイル: src/tools/color-palette/__tests__/logic.test.ts
- generateHarmony("complementary"): 色相が180度反転
- generateHarmony("analogous"): 色相が±30度
- generateHarmony("triadic"): 色相が120度, 240度
- generateHarmony("monochromatic"): 色相同一、明度が変化
- findSimilarTraditionalColors: 完全一致する伝統色が最初に返る
- generateFromKeyword("活気"): 赤/橙系の色が返る
- getContrastTextColor: 白背景→黒、黒背景→白
実装順序(builder向け)
Phase 1: Step 1.1 → 1.2 → 1.3(1.2と並行可能)→ 1.4 → 1.5(1.4と並行可能)→ 1.6 → 1.7 コミットポイント: 1.1完了後、1.4完了後、1.7完了後
Phase 2: Step 2.1 → 2.2(2.1と並行可能)→ 2.3 → 2.4 → 2.5 コミットポイント: 2.1完了後、2.3完了後、2.5完了後
Acceptance Criteria
Phase 1
- /colors で250色が一覧表示される(検索・カテゴリフィルタ動作)
- /colors/[slug] で各色の詳細表示(250ページ全て静的生成)
- /colors/category/[category] で7カテゴリの一覧表示
- 辞典ハブ /dictionary に伝統色辞典カード表示
- SEOメタデータ(title, description, canonical, JSON-LD DefinedTerm)が全ページにある
- サイトマップに全色ページが含まれる
- Vitest テストが全てパス
- npm run build が成功
Phase 2
- /tools/color-palette で6種のハーモニーパレット生成可能
- カラーピッカー、HEX入力、キーワード入力、伝統色選択の4入力方式が動作
- 各色のコード(HEX/RGB/HSL)をコピー可能
- 伝統色ページ→パレットツールの遷移が動作(URLパラメータ経由)
- カラーコンバーターとの相互リンク動作
- ツールレジストリに登録済み
- Vitest テストが全てパス
- npm run build が成功
Rollback Approach
- 各Stepはコミットで区切られているため git revert で個別ロールバック可能
- Phase 1とPhase 2は独立しているためPhase 2だけのロールバックも容易
- データファイル(JSON)の変更は他のコードに影響しないためデータ修正も安全
Required Artifacts
Phase 1 (新規/変更ファイル一覧)
- src/data/traditional-colors.json(新規)
- src/lib/dictionary/types.ts(追加)
- src/lib/dictionary/colors.ts(新規)
- src/lib/dictionary/index.ts(追加)
- src/lib/seo.ts(追加)
- src/app/colors/layout.tsx(新規)
- src/app/colors/page.tsx + page.module.css(新規)
- src/app/colors/ColorIndexClient.tsx(新規)
- src/app/colors/[slug]/page.tsx(新規)
- src/app/colors/category/[category]/page.tsx + page.module.css(新規)
- src/components/dictionary/colors/ColorCard.tsx + .module.css(新規)
- src/components/dictionary/colors/ColorDetail.tsx + .module.css(新規)
- src/app/dictionary/page.tsx(変更)
- src/app/sitemap.ts(変更)
- src/lib/dictionary/tests/colors.test.ts(新規)
Phase 2 (新規/変更ファイル一覧)
- src/tools/color-palette/meta.ts(新規)
- src/tools/color-palette/logic.ts(新規)
- src/tools/color-palette/Component.tsx + Component.module.css(新規)
- src/tools/color-palette/tests/logic.test.ts(新規)
- src/tools/registry.ts(変更)
- src/tools/color-converter/meta.ts(変更)
- src/app/tools/[slug]/ToolRenderer.tsx(変更)
Next Actions
- project-manager: 計画をレビューし、承認後にbuilderへPhase 1の実装を指示
- builder: Phase 1 Step 1.1から実装開始