ShoelaceテーマのネイティブボタンでサイズUtilityクラスが機能しない問題を修正

shoelace-style/webawesome

Shoelaceテーマにおいて、wa-size-* utilityクラスがネイティブボタン要素に適用されなかった問題が解決されました。CSSレイヤーの優先順位を調整することで、utilityクラスによるサイズ指定が正しく反映されるようになっています。

背景

Shoelaceテーマでは、ネイティブボタン要素に対して @layer wa-theme-overridesfont-size: var(--wa-font-size-smaller) を適用していました。しかし、このレイヤーは @layer wa-utilities よりも後に定義されているため、レイヤーの優先順位によってテーマのスタイルが常にutilityクラスを上書きしていました。

#1892 で報告されたように、この問題により wa-size-swa-size-mwa-size-l といったサイズutilityクラスを適用しても、すべてのボタンが同じサイズで表示されていました。CSSのカスケードレイヤー仕様では、後に定義されたレイヤーが優先されるため、テーマレイヤーがutilityレイヤーを常に上書きする構造になっていました。

技術的な変更

packages/webawesome/src/styles/themes/shoelace.css において、サイズutilityクラス(.wa-size-s.wa-size-l)や size 属性が指定された場合に、それに応じた font-size とレイアウト用の --_size カスタムプロパティを上書きするよう変更されました。

変更前:

wa-button::part(label),
wa-radio[appearance='button'],
button,
input[type='button'],
input[type='reset'],
input[type='submit'],
a.wa-button {
  font-size: var(--wa-font-size-smaller);
}

変更後:

wa-button {
  &::part(label) {
    font-size: var(--wa-font-size-s);
  }

  &[size='small']::part(label),
  &.wa-size-s::part(label) {
    font-size: var(--wa-font-size-xs);
  }

  &[size='large']::part(label),
  &.wa-size-l::part(label) {
    font-size: var(--wa-font-size-m);
  }
}

wa-radio[appearance='button'],
button,
input[type='button'],
input[type='reset'],
input[type='submit'],
a.wa-button {
  --_size: var(--wa-font-size-m);
  font-size: var(--wa-font-size-s);

  &[size='small'],
  &.wa-size-s {
    --_size: var(--wa-font-size-s);
    font-size: var(--wa-font-size-xs);
  }

  &[size='large'],
  &.wa-size-l {
    --_size: var(--wa-font-size-l);
    font-size: var(--wa-font-size-m);
  }

  --wa-form-control-padding-block: calc(0.75 * var(--_size));
  --wa-form-control-padding-inline: var(--_size);
  --wa-form-control-height: round(
    calc(2 * var(--wa-form-control-padding-block) + var(--_size) * var(--wa-form-control-value-line-height)),
  );
}

ネイティブボタン要素に対しては、--_size というカスタムプロパティを導入し、意図されたサイズを保持するようになりました。font-size はShoelaceテーマの視覚的特性を維持するため1段階小さいサイズを使用しますが、--_size は本来のサイズを保持し、パディングや高さの計算に使用されます。

このアプローチにより、フォントサイズは小さくなっても、ボタンの高さとパディングは他のフォームコントロールと同じサイズで一致するようになります。--wa-form-control-padding-block--wa-form-control-padding-inline--wa-form-control-height といったemベースのレイアウトプロパティは、実際の font-size ではなく --_size を参照して計算されます。

Web Componentsの wa-button についても、size 属性や .wa-size-* クラスに応じて ::part(label) のフォントサイズがスケールするよう、明示的なスタイル定義が追加されました。デフォルトは var(--wa-font-size-s)small サイズでは var(--wa-font-size-xs)large サイズでは var(--wa-font-size-m) が適用されます。

設計判断

カスタムプロパティによる二重管理 という設計が採用されました。font-size--_size を分離することで、視覚的な一貫性(Shoelaceテーマではボタンのフォントが小さい)を保ちながら、レイアウトの一貫性(他のフォームコントロールと高さが揃う)も確保しています。

この設計により、utilityクラスの有無に関わらず、Shoelaceテーマの視覚的特性が維持されます。レイヤーの優先順位を変更するのではなく、テーマレイヤー内で各サイズに応じたスタイルを明示的に定義することで、utilityクラスによる指定を実質的に上書きする実装になっています。

まとめ

本PRは、CSSレイヤーの優先順位問題を、各サイズに応じたスタイル定義とカスタムプロパティの導入によって解決しました。レイヤーの順序を変更するのではなく、テーマレイヤー内でutilityクラスや属性に応じたスタイルを上書きする設計により、既存のレイヤー構造を維持しながら問題を解決しています。フォントサイズとレイアウトサイズを分離することで、Shoelaceテーマの視覚的特性を損なうことなく、サイズutilityクラスの機能を復元しています。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

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

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

総論(リード文)→各論(背景、技術的な変更、設計判断)→結論(まとめ)の構成が明確で、読者が変更の全体像を理解しやすい構造になっています。

カスタムMarkdown構文 ✓ PASS

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

ファイル名付きシンタックスハイライト(```css:filepath```)やGitHubのIssue/PRリンク記法([#1892](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

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

CSSレイヤー、カスタムプロパティ、Web Componentsの`::part`など、専門知識を持つエンジニアを対象とした適切な技術レベルと表現で書かれています。

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

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

各セクションが総論・各論・結論の構成を持ち、各段落はトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が守られており、非常に読みやすいです。

Diff内容との照合 ⚠ WARNING

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

変更後のコードはDiffを正確に反映していますが、「変更前」のコードブロックがDiffの削除部分と完全には一致していません。文脈を補うための編集と推察されますが、厳密さには欠けます。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「CSSカスケードレイヤー」「カスタムプロパティ」「utilityクラス」などの技術用語が、文脈に沿って正確に使用されています。

説明の技術的正確性 ✓ PASS

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

レイヤーの優先順位の問題、カスタムプロパティ`--_size`の導入による解決策など、技術的な説明はDiffの内容と整合しており、論理的で正確です。

事実の突合 ⚠ WARNING

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

「設計判断」セクションはPRのDescriptionに明記されていない設計意図を言語化したものであり、コードからの妥当な解釈ですが、厳密にはPR情報外の推測に基づいています。

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

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

PR番号(#2049)および関連するIssue番号(#1892)が正確に記載されています。

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

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

記事のタイトル「ShoelaceテーマのネイティブボタンでサイズUtilityクラスが機能しない問題を修正」は、PRのタイトルと内容を正確に要約しています。

外部知識の正確性 ✓ PASS

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

記事の内容は提供されたPR情報とDiffに限定されており、バージョンサポート状況などのPRにない外部知識の追加はありません。

時間表現の正確性 ✓ PASS

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

「問題が解決されました」といった時間表現は、完了したPRの内容を正しく反映しており、歪曲はありません。