ページシェル・フッター・サイドバーの幅を統一しスタイルを整理

shoelace-style/webawesome

Web Awesome のドキュメントページは、ページシェル、フッター、サイドバーが個別に幅を定義していたため、ビューポートが変わるとレイアウトがずれるケースがありました。本 PR は幅を統一し、関連フラグとマークアップを整理することで、ページ全体の一貫性と保守性を向上させます。

背景

これまでは wa-prose<main> に直接掛かり、wa-page::part(body) の横幅が可変でした。その結果、メイン、フッター、サイドバーが同一ベースラインで揃わず、デスクトップとモバイルで見た目が不揃いになることがありました。加えて、hasFlushMainhasFramedMainhasWideMain など名前が似通ったフラグが散在し、テンプレートロジックが複雑化していました。今回の変更は、幅の定数化とフラグの統一により、レイアウトの根本的なずれを解消することを目的としています。

技術的な変更

ページ幅の定数化 として utils.css--page-max-inline-size: 90rem が導入され、.content-containermax-inline-size がこのカスタムプロパティに従うよう変更されました。

.content-container {
  margin-inline: auto;
  max-inline-size: var(--max-inline-size, var(--page-max-inline-size));
  padding-inline: var(--content-padding-inline);
}

フラグ名の統一 が行われ、hasProseContenthas-prose-contenthasOutlinehas-outline にリネームされました。base.njk では新しいクラス名に合わせて isProseWrapped を再計算し、body 要素に適切なクラスが付与されます。

{% set isProseWrapped = hasFramedMain != false and hasProseContent %}
<body class="layout-{{ layout | stripExtension }} page-{{ pageType }}{{ ' has-prose-content' if isProseWrapped }}{{ ' has-outline' if hasOutline }}">

アウトラインの構造分離 により、wa-prose ラップからアウトラインが外へ移動し、展開可能なアウトラインは <wa-details> コンポーネントで実装されました。outlineTransformerlistClasslinkIcon オプションを受け取り、リスト項目にアイコンを追加できるよう拡張されています。

export function outlineTransformer(options = {}) {
  const { listClass = '', linkIcon = '' } = options;
  // ...省略...
  if (options.linkIcon) {
    const icon = `<wa-icon name="${options.linkIcon}" variant="light" aria-hidden="true"></wa-icon>`;
    liMarkup = `<li data-level="${level}" class="wa-cluster wa-gap-xs wa-flex-nowrap">${icon}<a href="${escapedHref}">${escapedText}</a></li>`;
  } else {
    liMarkup = `<li data-level="${level}"><a href="${escapedHref}">${escapedText}</a></li>`;
  }
  const li = parse(liMarkup);

サイドバーとナビゲーションのマークアップ整理 では、slot-navigation.njk のラッパーが <nav> に変更され、aria-label が付与されました。また、sidebar.njk が大幅にリファクタリングされ、コンポーネントリスト生成マクロ sidebarComponent が導入され、hasProisExperimental に応じた表示ロジックが統一されています。

{%- macro sidebarComponent(page, suppressProBadge=false) -%}
  {%- set isExperimental = page.data.component && page.data.component.status == 'experimental' -%}
  {%- set isPro = page.data.isProComponent && not suppressProBadge -%}
  {%- if isPro %}<span class="wa-split">{% endif -%}
  <a{% if isExperimental %} class="wa-cluster wa-gap-xs"{% endif %} href="{{ page.url }}">{{ page.data.title }}{% if isExperimental %} <wa-icon name="flask" aria-hidden="true" class="icon-shrink de-emphasize"></wa-icon>{% endif %}</a>
  {%- if isPro %} {{ proBadge() }}</span>{% endif -%}
{%- endmacro %}

フッターとメイン領域のパディング調整 では、docs.css にメインのブロック・インラインパディングが --content-padding-inline--wa-space-* トークンに基づく階層的設定へ変更され、フッターは常に var(--wa-space-xl) のパディングを保持するようになりました。

wa-page > main {
  padding-block: var(--wa-space-xl);
  padding-inline: var(--content-padding-inline);
  margin-inline: auto;
}

@media screen and (min-width: 75rem) {
  wa-page > main { padding-inline: var(--wa-space-4xl); }
}

:is(.layout-docs, .layout-component, .layout-page, .layout-page-outline, .layout-pattern) .page-footer {
  padding: var(--wa-space-xl);
  border-block-start: var(--wa-border-style) var(--wa-panel-border-width) var(--wa-color-surface-border);
  margin-block-start: var(--wa-space-2xl);
}

設計判断

幅の定数化 によってページ全体が同一ベースラインで揃うようになり、個別ページでの横幅調整が不要になりました。この設計は CSS カスタムプロパティだけで実装され、既存のスタイルシートへの影響を最小限に抑えています。フラグ命名の統一has* 系を一貫して使用することで、テンプレート側の条件式が直感的になり、保守時の誤認識リスクが低減されました。アウトラインの分離 はプロースタイリングとナビゲーションの相互依存を解消し、<wa-details> コンポーネントによるアクセシビリティ向上が実現されています。サイドバーのマクロ化 はコンポーネントリスト生成ロジックを一元管理し、将来的な項目追加や表示制御をコード変更なしで行える基盤を提供します。

まとめ

ページシェル、フッター、サイドバーの幅を統一し、フラグとマークアップを整理したことで、Web Awesome のドキュメントはレイアウトの一貫性と保守性が向上しました。これにより、個別ページで幅やクラスを個別に調整する必要がなくなり、コードベースがシンプルになっています。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
a716f55d

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

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

リード文がタイトル直下に配置され、背景・技術的変更・設計判断・まとめの各セクションが揃っており、「総論→各論→結論」の構成が明確です。

カスタムMarkdown構文 ⚠ WARNING

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

コードブロックは `言語:ファイルパス` の形式で正しく記述されていますが、GitHubリンクが `[PR #2505](URL)` となっており、推奨の `[ #2505 ](URL)` 形式と完全には一致していません。

対象読者への適合性 ✓ PASS

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

専門的なエンジニア向けの記述で、余計な初心者向け解説はありません。

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

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

各セクションは総論パラグラフ、具体例・コードブロックによる各論、まとめパラグラフで構成され、段落はトピックセンテンスで始まり1トピックに絞られ、長さも適切です。

Diff内容との照合 ✓ PASS

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

記事中のコードブロックは提供されたDiffの内容と一致しています。抜けている diff(.eleventy.js の追加)は記事の必須要件ではないため影響なし。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

PRで使用されている用語(has-prose-content、has-outline など)を正確に使用しています。

説明の技術的正確性 ✓ PASS

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

変更の目的・効果が PR の説明と合致しており、技術的に誤りはありません。

事実の突合 ✓ PASS

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

PR に記載されている事実以外の推測や根拠のない数値は提示されていません。

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

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

PR 番号 #2505 および 90rem といった数値は正確です。

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

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

記事タイトルは PR の内容を正しく日本語化しており、一致しています。

外部知識の正確性 ✓ PASS

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

LTS やリリース日程等、PR に無い外部情報は一切記載されていません。

時間表現の正確性 ✓ PASS

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

時間表現は使用しておらず、PR と食い違う箇所もありません。