ドキュメント基盤を刷新:サイドバー再設計・インストールタブ同期・バックドロップフィルター対応

shoelace-style/webawesome

Web Awesomeのドキュメントサイト全体にわたる大規模なUI/UX改善が実施された。サイドバーの情報設計を整理し、インストール手順タブの選択状態をlocalStorageで横断同期する仕組みを新設し、<wa-dialog><wa-drawer>--backdrop-filterプロパティを追加している。

背景

このPRは「サイドバーの整理」という小さな目的で始まったが、ドキュメント全体の情報構造上の問題が連鎖的に発見された結果、広範な変更へと拡張された。具体的には以下の問題が積み重なっていた。

  • Style Utilities と Layout Utilities が別ページに分離しており、リンク先が /docs/layout/docs/utilities に散在していた
  • コンポーネントの説明文が front matter の description フィールドとソースコードの JSDoc に二重管理されていた
  • インストール手順タブ(CDN / npm / Self-Hosted)の選択状態がページをまたぐと毎回リセットされていた
  • パターンページでアウトラインが強制 true になっており、レイアウトの柔軟性がなかった

これらが組み合わさり、ドキュメントの閲覧体験を断片的なものにしていた。

技術的な変更

インストールタブの横断同期(install-tabs.js

最も実装面で注目すべき変更は、新設された install-tabs.js による <wa-tab-group> の同期機構だ。従来は各ページごとにタブ選択状態がリセットされていたが、このスクリプトはページロード時に localStorage から前回の選択を読み出し、同一ページ内の全 [data-install-tabs] グループに反映する。

const STORAGE_KEY = 'wa-install-tab';
const KNOWN_PANELS = ['cdn', 'npm', 'self-hosted', 'hosted', 'react'];
const FALLBACKS = { react: 'npm' };

フォールバック機構も備わっており、react タブが存在しないページでは自動的に npm にフォールバックする。WeakMap を使った suppressed マップにより、プログラムによる group.active 変更とユーザー操作を区別し、プログラム変更がさらにストレージ書き込みを起こすイベントループを防いでいる。また、従来の sidebar.js(26行)は不要になり削除された。

コンポーネント説明文の一元化

component.njk レイアウトで description front matter の参照が廃止され、代わりにソースコードの @summary JSDoc タグ から取得した component.summary を使う形に統一された。

 {% set component = getComponent('wa-' + page.fileSlug) %}
+{% set description = component.summary %}

これに伴い、51以上のコンポーネントの .md ファイルから description: front matter が削除されている。単一の真実のソース(SSoT)として JSDoc を選択したことで、ソースコードとドキュメントの乖離リスクが解消される。

--backdrop-filter カスタムプロパティの追加

<wa-dialog><wa-drawer>--backdrop-filter CSS カスタムプロパティが追加された。検索ダイアログはこれを利用して blur(6px) のバックドロップブラーを適用している。

#site-search {
  --backdrop-filter: blur(6px);
  width: 38rem;

コンポーネント側にプロパティを露出させることで、ドキュメントの特定ニーズのためにコンポーネント本体を改変せず、CSS変数の注入だけで視覚効果を実現している。

レイアウト・テンプレートの hasOutline 対応

docs.njkpattern.njk の両レイアウトで、hasOutline の扱いが「常に true」から「front matter で制御可能」に変更された。

変更前:

{% set hasOutline = true %}

変更後:

{% if hasOutline == undefined %}{% set hasOutline = true %}{% endif %}

pattern.njk はデフォルトを false に設定し、パターン一覧系のページではアウトライン(目次)を非表示とした。

Markdownコールアウトの <wa-callout> 移行

markdown.js のコンテナプラグインが、独自クラスの <div> から <wa-callout Web Component を使うよう書き直された。これにより info / warning / pro の3種のコールアウトがすべてデザインシステムのコンポーネントで統一される。

// 変更前
return `
  <div class="callout callout-${variant}">
    <wa-icon class="callout-icon" name="${icon}"></wa-icon>
    <div class="callout-content">
`;

// 変更後
return `
  <wa-callout variant="${variant}">
    <wa-icon slot="icon" name="${icon}" variant="regular"></wa-icon>
`;

pro コールアウト用の新しいコンテナも追加され、Pro限定コンテンツをマークアップする標準的な手段が整備された。

プラットフォーム検出によるキーボードショートカット表示

base.njk のインライン <script> に macOS / iOS 検出ロジックが追加され、navigator.platform を見て is-mac クラスを <html> 要素に付与する。これにより検索トリガーのツールチップが macOS では ⌘K、その他では Ctrl+K と表示される。

document.documentElement.classList.toggle('is-mac', /Mac|iPhone|iPad/.test(navigator.platform));

CSS側では .is-mac .non-machtml:not(.is-mac) .mac-onlydisplay: none にすることで、JavaScriptクラスに応じて表示を切り替えている。

設計判断

description front matter を廃止して @summary JSDoc に一本化した判断は、コンテンツとコードを同じファイルで管理することでズレを防ぐという原則に基づいている。front matter でコンポーネント説明を管理していた場合、ソース側の変更が反映されない状態が生まれやすく、51ページ以上に分散していた重複を解消している。

install-tabs.js での WeakMap 活用は、DOM要素のライフサイクルに紐付いたフラグ管理として適切な選択だ。ページ遷移で要素がGCされれば自動的にエントリも消えるため、明示的なクリーンアップが不要になる。

hasOutline をデフォルト値で制御する方式は、既存ページへの影響を最小化しつつ新しいページタイプ(パターンページ)に異なるデフォルトを設定できる。undefined チェックによる条件設定は、テンプレート継承の仕組みを壊さずに柔軟性を得る実用的な手法だ。

まとめ

このPRはドキュメントの情報設計・コンポーネントAPI・JavaScriptインフラの三層にまたがった整合性向上の変更だ。特に @summary JSDocへの一元化と install-tabs.js によるセッション状態の永続化は、ドキュメントサイトの保守性と利用者体験の両方に継続的に効いてくる設計判断といえる。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
ed83a06a

この記事は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リンク記法(例: [PR #2326](URL))が、ガイドライン通りに正しく使用されています。

対象読者への適合性 ✓ PASS

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

localStorage、WeakMap、CSSカスタムプロパティなどの技術要素について、専門知識を持つエンジニアを対象とした適切なレベルで解説されており、過度な初心者向けの説明はありません。

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

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

各セクション、各パラグラフが「総論→各論」の構造で書かれており、トピックセンテンスが段落の冒頭に配置されています。1段落1トピックの原則も守られており、非常に高い可読性を実現しています。

Diff内容との照合 ✓ PASS

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

記事内で引用されているすべてのコードブロックは、提供されたDiff情報と正確に一致しています。コードの省略は要点を損なわない範囲に留まっており、技術的理解を正確に伝えています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

JSDoc、front matter、SSoT (Single Source of Truth)、WeakMapなど、使用されている技術用語はすべて文脈に即しており、正確です。

説明の技術的正確性 ✓ PASS

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

localStorageを用いた状態の永続化、WeakMapによるイベントループの防止、CSSカスタムプロパティの注入によるコンポーネントのカスタマイズ性向上など、すべての技術的説明が論理的かつ正確です。

事実の突合 ✓ PASS

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

記事内のすべての主張は、PRのDescriptionやDiff内のコード変更によって裏付けられています。特に、PR Descriptionの「What started as a simple PR...」という背景を的確に捉えており、ハルシネーションは見られません。

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

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

PR番号(#2326)、削除された `sidebar.js` の行数(26行)、`description` が削除されたコンポーネントファイル数(51以上)など、記事に含まれるすべての数値・固有名詞が正確です。

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

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

記事のタイトルは、PRの抽象的なタイトル「Sidebar and, well, a whole lot more」を、「サイドバー再設計・インストールタブ同期・バックドロップフィルター対応」と具体的に要約しており、PRの内容を正確かつ魅力的に伝えています。

外部知識の正確性 ✓ PASS

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

記事には、PR情報に基づかないバージョンサポート状況やリリース日程などの外部知識は含まれていません。

時間表現の正確性 ✓ PASS

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

PRで実施された変更内容について、時間的な表現の歪曲(例:「将来」を「既に」と書くなど)は見られず、事実関係が正確に記述されています。