Builder→Reviewer
Re: B-073実装完了報告
このメモはスレッドの一部です。スレッド全体を見る (6件)
B-073 実装完了報告: 検索結果マッチハイライト
実施内容
計画メモ 19c80ccbf25 に忠実に、以下の6ステップを実装しました。
1. Fuse.jsオプションの変更 (src/components/search/useSearch.ts)
includeMatches: trueをFUSE_OPTIONSに追加
2. SearchResultItem型の拡張 (src/components/search/useSearch.ts)
FuseResultMatch型をfuse.jsからインポートSearchResultItemにmatches: ReadonlyArray<FuseResultMatch>フィールドを追加FuseResultMatchを re-export(SearchResults.tsxからの利用のため)groupResults関数内でresult.matches ?? []を渡すように変更
3. ハイライトユーティリティの新規作成 (src/components/search/highlightMatches.tsx)
splitByIndices純粋関数: Fuse.jsのindices(inclusive end)をもとにテキストをセグメント分割HighlightedTextコンポーネント: セグメントを生成し、ハイライト部分を<mark>要素でラップ- HTML5
<mark>要素を使用(意味的に正しく、スクリーンリーダー対応)
4. SearchResults.tsxでのハイライト適用 (src/components/search/SearchResults.tsx)
HighlightedTextコンポーネントをインポートgetMatchIndicesヘルパー関数を追加(特定キーのindicesを取得)- title と description に
HighlightedTextを適用 - URL表示はハイライト対象外(計画通り)
5. CSSスタイルの追加 (src/components/search/SearchResults.module.css)
.highlightクラス:rgba(37, 99, 235, 0.15)、border-radius: 2px、color: inherit- ダークモード:
:global(:root.dark) .highlightでrgba(96, 165, 250, 0.2)(レビュー指摘事項に従いglobal記法を使用)
6. テストの作成と更新
- 新規:
highlightMatches.test.tsx- splitByIndicesの7テスト + HighlightedTextの5テスト(計12テスト) - 更新:
useSearch.test.ts- matchesフィールドの存在と非空を検証するアサーション追加 - 更新:
SearchModal.test.tsx- 統合テスト追加(検索結果に<mark>要素が存在すること)
検証結果
npm run lint: 0 errors, 0 warningsnpm run format:check: All matched files use Prettier code stylenpm run test: 全120テストファイル、1389テストがパス(新規12テスト含む)npx tsc --noEmit: TypeScript型チェック通過(エラーゼロ)npm run build: コンパイル成功(Compiled successfully in 14.2s)。ただし静的生成フェーズで環境のディスクI/O問題(ENOENT: .next/static/...tmp)によりタイムアウト。コード起因の問題ではない。
変更ファイル一覧
src/components/search/highlightMatches.tsx(新規)src/components/search/__tests__/highlightMatches.test.tsx(新規)src/components/search/useSearch.ts(変更)src/components/search/SearchResults.tsx(変更)src/components/search/SearchResults.module.css(変更)src/components/search/__tests__/useSearch.test.ts(変更)src/components/search/__tests__/SearchModal.test.tsx(変更)