検索UIのアイコン体系を統一

shoelace-style/webawesome

Web Awesomeのドキュメント検索機能が、サイドバーナビゲーションと同じアイコン体系を採用し、デザイントークンによる一貫したスタイル管理を実現しました。ハードコードされたCSS値をCSS変数に置き換えることで、保守性と視覚的な統一感が向上しています。

背景

#2019でサイドバーのセクション見出しに新しいアイコンが追加されましたが、検索結果のアイコンは旧来の仕組みのままでした。「Components」セクションにはtrowel-bricks、「Frameworks」にはpuzzleといった新しいアイコンがサイドバーで使われる一方、検索結果ではpuzzle-piececodeなどの異なるアイコンが表示されていました。

サイドバーと検索結果で異なるアイコン体系を使用することは、ユーザーの認知負荷を高め、インターフェース全体の一貫性を損ないます。また、検索UIのスタイル定義には1.75rem0.875remといったハードコードされた値が使われており、デザイントークンによる統一的なスタイル管理が行われていませんでした。

技術的な変更

search.jsに包括的なアイコンマッピングシステムが実装されました。iconByPrefix配列は、URLプレフィックスとアイコン名のペアを保持し、パス長の降順でソートされています。

const iconByPrefix = [
  ['/license', 'file-contract'],
  ['/tos', 'file-contract'],
  ['/privacy', 'file-contract'],
  // ...
  ['/docs/components', 'trowel-bricks'],
  ['/docs/patterns', 'block-brick'],
  ['/docs/frameworks', 'puzzle'],
  ['/docs/tokens', 'coin-front'],
  ['/docs/resources/agent-skills', 'sparkles'],
  // ...
].sort((a, b) => b[0].length - a[0].length);

長いパスから順に評価することで、/docs/utilities/nativeのような詳細なパスが/docs/utilitiesよりも優先的にマッチします。これにより、セクション階層に応じた正確なアイコン割り当てが可能になります。

検索結果の生成処理では、ホームページと/docsページに特別な処理を施した後、iconByPrefix配列を順に評価してアイコンを決定します。

if (page.url === '/') icon = 'home';
else if (page.url === '/docs') icon = 'rocket-launch';
else {
  for (const [prefix, prefixIcon] of iconByPrefix) {
    if (page.url.startsWith(prefix)) {
      icon = prefixIcon;
      break;
    }
  }
}

search.cssでは、ハードコードされたフォントサイズとスペーシング値がデザイントークンに置き換えられました。

/* 変更前 */
font-size: 1.75rem;
font-size: 1.25rem;
font-size: 0.875rem;
padding: 3rem 2rem;

/* 変更後 */
font-size: var(--wa-font-size-xl);
font-size: var(--wa-font-size-l);
font-size: var(--wa-font-size-s);
padding: var(--wa-space-3xl) var(--wa-space-2xl);

フッターレイアウトは、個別のFlexboxプロパティ定義からユーティリティクラスに移行しました。

<!-- 変更前 -->
<footer>

<!-- 変更後 -->
<footer class="wa-cluster wa-justify-content-center wa-gap-xl">

wa-clusterクラスはFlexboxレイアウトを提供し、wa-justify-content-centerwa-gap-xlで中央揃えと要素間隔を指定します。CSSファイルからは対応するFlexboxプロパティ定義が削除されています。

設計判断

URLプレフィックスによるアイコンマッピング方式が採用されました。検索結果の各ページに明示的にアイコン情報を持たせるのではなく、URLパターンからアイコンを推論する仕組みです。

このアプローチには2つの利点があります。第一に、サイドバーナビゲーションのアイコン定義と検索結果のアイコン割り当てを一元的に管理できます。sidebar.njkでセクションアイコンを変更した際、search.jsiconByPrefix配列を更新するだけで検索結果にも反映されます。第二に、各ページのメタデータにアイコン情報を追加する必要がなく、既存のコンテンツ構造を変更せずに実装できます。

配列を降順ソートする設計により、/docs/utilities/nativeのような詳細パスが/docs/utilitiesよりも優先されます。これは最長一致の原則に基づいており、階層的なURL構造に対して自然なアイコン解決を実現しています。

PR本文では「more refactor work to do」と述べられており、f3f7bc2で行われた変更が出発点に過ぎないことが示されています。デザイントークンへの移行は段階的に進められる方針です。

まとめ

本PRは、検索UIとサイドバーナビゲーションのアイコン体系を統一し、ハードコードされたスタイル値をデザイントークンに置き換えた変更です。URLプレフィックスベースのマッピング方式により、サイトナビゲーション全体で一貫したビジュアル言語が確立され、今後のアイコン変更に対する保守性も向上しています。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文(総論)→セクション群(各論)→まとめ(結論)の3部構成が明確です。背景、技術詳細、設計判断といった必須要素がすべて含まれており、理想的な構成です。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライト(例: ```javascript:path/to/file.js)およびGitHubリンク記法(PR番号、コミットID)が、ガイドラインに沿って正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

デザイントークン、ユーティリティクラス、URLプレフィックスによるマッピングといった内容は、対象読者であるエンジニアに適した技術レベルと表現で書かれています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションとパラグラフが総論から始まる構成になっており、1段落1トピックが守られています。段落の長さも適切で、非常に読みやすい文章です。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されているすべてのコードブロック(.js, .css, .njk)は、提供されたDiffの内容と正確に一致しています。ファイルパスの指定も正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「デザイントークン」「ユーティリティクラス」「アイコンマッピング」など、PRの文脈に沿った技術用語が正確かつ適切に使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

URLプレフィックス配列をパス長の降順でソートする理由(最長一致)の説明など、コード変更の背後にあるロジックが技術的に正確に解説されています。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張(例: 「#2019」でのアイコン改訂、ハードコードされた値の問題)は、PRのDescriptionやDiffの内容によって裏付けられており、ハルシネーションは見られません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#2029, #2019)やコミットID(f3f7bc2)などの数値・固有名詞は、提供された情報と完全に一致しています。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトル「検索UIのアイコン体系を統一」は、PRのタイトル「Docs: Sync Up Search Iconography」の主旨を的確に反映しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

PR情報に含まれない外部知識(例: バージョンのサポート状況、リリース日程)の追記はなく、提供された情報源に忠実な内容となっています。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

PR内の時間表現(例: recently revised)を正しく解釈し、背景説明に反映できています。時間的な歪曲はありません。