ボタングループのCSSカスタムプロパティをリファクタリング

shoelace-style/webawesome

#2044 で導入されたCSSベースのボタングループ実装に続き、内部カスタムプロパティの命名規則を整理するとともに、ボーダー幅をテーマ変数から動的に参照するよう改善されました。

背景

前PRである#2044では、JavaScriptによるDOM走査に依存していたボタングループのスタイリングを純粋なCSSで実現するリファクタリングが行われました。その際に導入された内部カスタムプロパティには --_wa-button-* という命名規則が採用され、グループ内ボタンのマージン計算にはハードコードされた 1px が使用されていました。

今回のPRはその後続対応として位置づけられており、内部カスタムプロパティの wa プレフィックス除去、ボーダー幅のテーマ変数への統一、そしてドキュメントに残っていたリファクタリング検証用のテスト例の削除が行われています。

技術的な変更

内部カスタムプロパティの命名規則が --_wa-button-* から --_button-* へと変更されました。この変更は button-group.styles.tsbutton.styles.tsbutton-group.test.ts の3ファイルにまたがって一斉に適用されています。

変更前:

:host([orientation='horizontal']) {
  --_wa-button-horizontal-indent: 1px;
  --_wa-button-horizontal-indent-outlined: calc(var(--wa-border-width-s) * -1);
}

変更後:

:host([orientation='horizontal']) {
  --_button-horizontal-indent: var(--wa-form-control-border-width);
  --_button-horizontal-indent-outlined: calc(var(--wa-form-control-border-width) * -1);
}

インデント量の計算に使用するトークンも --wa-border-width-s から --wa-form-control-border-width へ変更されました。これにより、グループ内ボタンのマージンがフォームコントロールのボーダー幅と連動し、テーマ変更が反映されるようになります。同様に button.styles.ts でも border-width: var(--wa-border-width-s)border-width: var(--wa-form-control-border-width) に、border-style: var(--wa-border-style)border-style: var(--wa-form-control-border-style) にそれぞれ更新されています。

テストコードにおいても、ハードコードされた 1px との直接比較が廃止されました。代わりに getComputedStyle--wa-form-control-border-width の実際の値を取得し、それと照合する形に改められています。

// 変更前
Array.from(allButtons).every(button =>
  expect(button).to.have.style('--_wa-button-horizontal-indent', '1px')
);

// 変更後
Array.from(allButtons).every(button => {
  const themedIndent = getComputedStyle(button).getPropertyValue('--wa-form-control-border-width').trim();
  expect(button).to.have.style('--_button-horizontal-indent', themedIndent);
});

また awesome.css テーマファイルには、accent アピアランスのボタンをボタングループ内で outlined と同様に扱うルールが追加されました。

wa-button-group[orientation='horizontal'] {
  wa-button[appearance='accent'] {
    margin-inline-start: var(--_button-horizontal-indent-outlined);
  }
}
wa-button-group[orientation='vertical'] {
  wa-button[appearance='accent'] {
    margin-block-start: var(--_button-vertical-indent-outlined);
  }
}

設計判断

内部カスタムプロパティの命名規則を --_button-* に統一することで、プロパティ名から wa プレフィックスが除去されました。これにより、内部プロパティは --_* という一貫した規則のみで識別されます。

ボーダー幅のトークンを --wa-border-width-s から --wa-form-control-border-width へ変更した点は、PRのDescriptionに「ensures that it adapts to the theme instead of being hardcoded to 1px」と明記されています。ハードコードされた 1px をテーマ変数で置き換えることで、テーマのカスタマイズがボタンのボーダーとグループのマージン双方に一貫して反映されます。

まとめ

今回の変更は、前回のアーキテクチャ刷新に続く仕上げ作業として、内部プロパティの命名規則の整理とテーマ変数への一元化を行うものです。--_button-* という命名規則と --wa-form-control-border-width への統一により、テーマのカスタマイズ性が向上し、ボーダー幅の変更がボタンスタイル全体に一貫して適用されるようになっています。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
645579e6

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

品質レビュー結果

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

Review Criteria:

記事構成 ✓ PASS

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

リード文(総論)、背景・技術詳細・設計判断(各論)、まとめ(結論)という明確な3部構成が守られています。

カスタムMarkdown構文 ✓ PASS

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

ファイル名付きシンタックスハイライトの形式(```言語:ファイルパス)や、PR番号のリンク記法([#123](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

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

CSSカスタムプロパティ、テーマ変数、命名規則といった内容は、専門知識を持つエンジニアという対象読者に適切です。

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

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

各セクションと各パラグラフが要点(トピックセンテンス)から始まる構成になっており、非常に読みやすいです。1段落1トピックの原則も守られています。

Diff内容との照合 ✓ PASS

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

記事内で引用されているすべてのコードブロックは、提供されたDiff情報と完全に一致しています。特に、複数のファイルにまたがる変更を的確に抽出し、説明と対応させています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「CSSカスタムプロパティ」「テーマ変数」「トークン」「ハードコード」などの技術用語が、文脈に沿って正確に使用されています。

説明の技術的正確性 ✓ PASS

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

「ハードコードされた値をテーマ変数に置き換えることでカスタマイズ性が向上する」という説明は、Diffの内容とPRの意図を技術的に正しく反映しています。

事実の突合 ✓ PASS

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

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

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

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

PR番号(#2044, #2128)や、CSSカスタムプロパティ名、ファイル名などの固有名詞が正確に記載されています。

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

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

「ボタングループのCSSカスタムプロパティをリファクタリング」というタイトルは、PRの主題(命名規則の変更、テーマ変数利用)を的確に要約しています。

外部知識の正確性 ✓ PASS

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

PR情報に含まれない外部の知識(バージョン情報、サポート状況など)は記載されていません。

時間表現の正確性 ✓ PASS

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

「〜されました」「行われました」といった過去・完了形の表現が、完了したPRの内容を正しく反映しており、時間表現の歪曲はありません。