コンポーネントステータスバッジをマクロで統一管理

shoelace-style/webawesome

ドキュメントの個別コンポーネントビューとコンポーネント一覧ページに散在していたバッジ描画ロジックを、共有マクロ componentStatusBadges に集約しました。これにより、バッジの見た目と振る舞いがサイト全体で一貫して保たれます。

背景

同じStable/Experimentalバッジと「Since X.X」バッジが、component.njk(個別ビュー)と index.njk(一覧ページ)の2か所に独立して実装されていました。両者は完全に同一ではなく、微妙な差異が生じていました。たとえばStableバッジの個別ビューでは variant="brand" が使われていましたが、一覧ページでは appearance 指定のない状態での描画になっており、「Since X.X」バッジの見た目も統一されていませんでした。

この重複した実装は、バッジのデザインや属性を変更する際に2か所を同期して修正しなければならないという保守上の課題を持っていました。今回の変更はその解消を目的としています。

技術的な変更

新たに作成された docs/_includes/macros/component-badges.njk が、ステータスバッジと「Since X.X」バッジのレンダリングを一手に担います。

追加されたマクロの実装は以下のとおりです:

{# Renders the status (Stable/Experimental) and "Since X.X" badges for a component.
   Used by the individual component view, the components index, and component cards. #}
{% macro componentStatusBadges(component) %}
{% if component.status == 'stable' %}
<wa-badge class="preview" variant="brand" pill>
  <wa-icon name="check" slot="start"></wa-icon>
  Stable
</wa-badge>
{% elif component.status == 'experimental' %}
<wa-badge variant="warning" appearance="filled" pill>
  <wa-icon name="flask" slot="start"></wa-icon>
  Experimental
</wa-badge>
{% endif %}
{% if component.since %}
<wa-badge class="since" variant="neutral" appearance="filled" pill>Since {{ component.since }}</wa-badge>
{% endif %}
{% endmacro %}

component.njkindex.njk 双方で、従来のインライン実装(計30行)が {{ componentStatusBadges(component) }} の1行に置き換えられています。

Stableバッジには class="preview" が付与されました。これはサイトパレットによるオレンジ色のブランドカラーテーマ(wa-theme-site)の適用から外れるためのクラスで、ページのテーマに関わらず常にデフォルトのブランドカラー(青)で表示されます。

「Since X.X」バッジには class="since" が付与され、対応するCSSルールが docs/assets/styles/utils.css に追加されました:

/* "Since X.X" badge: subtler than the default filled neutral */
wa-badge.since {
  background-color: var(--wa-color-surface-lowered);
}

--wa-color-surface-lowered を背景色に使うことで、Stable/Experimentalバッジよりも視覚的に控えめな表示となり、重要度の差が色で伝わるようになります。この .since ルールは既存の .pro.free.planned ルールと並んで定義されています。

設計判断

Nunjucksマクロによる抽象化が選ばれた点は、テンプレートエンジンの機能を活かした自然な判断です。マクロはコンポーネントオブジェクトを引数として受け取るため、呼び出し側はデータをそのまま渡せば済み、ステータスの種類や条件分岐をマクロ内に完全にカプセル化できています。

Stableバッジのスタイル統一にあたっては、一覧ページ側ではなく個別ビュー側の実装(variant="brand" + チェックアイコン)が基準として採用されています。これは視覚的に明確な表現を優先した判断と読み取れます。

「Since X.X」バッジは逆に、一覧ページ側の「控えめな表示」を基準とし、--wa-color-surface-lowered を使った新しいCSSクラスで実現しています。ステータスバッジとの視覚的な優先順位を明示しつつ、CSSトークンを使うことでテーマ変更への追従性も維持しています。

まとめ

この変更は、ドキュメントサイト内のバッジ描画ロジックを単一のマクロに集約することで、今後のデザイン変更や新たな呼び出し箇所(コンポーネントカードなど)への対応をシンプルにします。スタイルの不一致解消とコードの重複排除を同時に達成した、保守性向上を主眼とした整理といえます。

記事メタデータ

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

この記事は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リンク記法の正確性

ファイル名付きシンタックスハイライト(njk, css)とPR番号のリンク記法が、ガイドライン通りに正しく使用されています。

対象読者への適合性 ✓ PASS

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

NunjucksマクロやCSSカスタムプロパティといった用語が適切に使用されており、専門知識を持つエンジニアという対象読者に適合した内容です。

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

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

各セクション・各パラグラフが「総論→各論」の構造で書かれ、トピックセンテンスが明確です。段落の長さも適切で、非常に高い可読性を確保しています。

Diff内容との照合 ✓ PASS

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

記事内で引用されているコードブロック(マクロ定義、CSSルール)は、提供されたDiffの内容と完全に一致しています。また、「計30行が置き換えられた」という説明もDiffから正確に算出されています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

Nunjucksマクロ、CSSトークン、`variant`, `appearance`といったコンポーネントの属性など、技術用語の選択と使用法が正確です。

説明の技術的正確性 ✓ PASS

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

`class="preview"`がテーマの適用を回避する役割や、`.since`クラスが視覚的な優先度を下げる効果など、技術的な説明がPR Descriptionの内容と一致しており、正確です。

事実の突合 ✓ PASS

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

記事内の主張はすべて、PRのDescription、Diff内のコード、またはDiff内のコメントで裏付けられており、ハルシネーション(創作)は一切見られません。

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

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

PR番号(#2391)、ファイルパス、CSS変数名(--wa-color-surface-lowered)などの数値・固有名詞はすべて正確に記載されています。

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

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

記事のタイトル「コンポーネントステータスバッジをマクロで統一管理」は、PRの主題「Sync Component-Based Badges Across Views」を的確に要約しており、内容と一致しています。

外部知識の正確性 ✓ PASS

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

バージョン情報やリリース予定など、PR情報に基づかない外部知識の追加はなく、提供された情報源に忠実な内容です。

時間表現の正確性 ✓ PASS

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

時間表現に関する記述はなく、したがって歪曲もありません。