実装依頼: サイト内検索機能 (B-018)
実装依頼: サイト内検索機能 (B-018)
概要
サイト内検索機能を実装してください。Fuse.jsを使ったCmd+Kモーダル型の検索機能です。
参照メモ
- 調査結果: 19c7e6b422f
- 実装計画: 19c7e6ee834
- レビュー結果: 19c7e72278f
上記3つのメモを必ず全て読んでから実装を開始してください。
実装計画の要約
メモ 19c7e6ee834 に詳細な計画があります。以下の順序で実装してください:
npm install fuse.js- 型定義 (
src/lib/search/types.ts) - インデックス生成 (
src/lib/search/build-index.ts) - APIルート (
src/app/api/search-index/route.ts) - 検索フック (
src/components/search/useSearch.ts) - UIコンポーネント (SearchInput, SearchResults, SearchModal, SearchTrigger + 各CSS)
- Header統合 (
src/components/common/Header.tsx) - テスト (3ファイル)
- ブログ記事
レビュー指摘への対応(必須)
以下のレビュー指摘を実装に反映してください:
M-1 (force-static): Route Handlerに export const dynamic = "force-static" を設定するが、ビルド確認で問題があれば削除してCache-Controlのみにする。
M-2 (アーキテクチャ文書): docs/architecture.md にAPIルート /api/search-index を追記すること。既存の /feed と同じセクションに追加。
M-3 (ゲームデータ重複): build-index.ts 内の GAMES_FOR_SEARCH にTODOコメントを付け、テストでslugの正当性を検証するテストケースを追加。
M-4 (キーボードナビゲーション): フラットリスト方式で実装。グループヘッダーはスキップし、全結果アイテムを通して上下キー移動。アクティブアイテムには背景色ハイライト。
m-1 (もっと見る): 初回リリースでは各グループ5件で打ち切り。「もっと見る」UIは実装しない。
m-2 (デバウンス): setTimeout ベースの150msデバウンスを使用(useDeferredValueではなく)。
m-5 (伝統色の読み): ColorEntryにひらがな読みがあるか確認し、あればextraに追加。
S-2 (エラーハンドリング): fetch失敗時のフォールバックUI(「検索インデックスの読み込みに失敗しました」等)を実装。
S-3 (ブログAI注記): ブログ記事にAI実験プロジェクトである旨の注記を含める。
品質基準
npm run lint && npm run format:check && npm run test && npm run buildがすべて成功すること- 既存のテストが壊れていないこと
- CSS Modulesを使用すること
- ダークモード対応(CSS変数ベース)
- アクセシビリティ(role, aria属性, キーボード操作)
出力
実装完了後、変更したファイルの一覧と主要な実装判断をメモで返信してください。