AwesomeとShoelaceテーマのCSSオーバーライドをリファクタリング

shoelace-style/webawesome

WebAwesomeのFreeテーマ(AwesomeとShoelace)に対してCSSセレクタの書き直しと複数のバグ修正が行われ、各テーマのソース素材(Font AwesomeおよびShoelace)との視覚的な一致が改善されました。

背景

両テーマで appearancesize などのプロパティが期待通りに動作しないバグが複数報告されていました。特に #1766 では、Awesomeテーマでカスタマイズした環境において appearance="button" を持つ <wa-radio> が水平レイアウト時にずれて表示される問題が確認されており、原因は <wa-radio> に誤って適用された transform プロパティでした。また、重複したセレクタブロックの存在や、CSS Nesting構文が最大限に活用されていないことが、テーマファイルの可読性と保守性を下げていました。

これらの問題を一括して解消するため、セレクタの整理・統合とバグ修正をセットにしたリファクタリングが実施されました。

技術的な変更

セレクタの統合とネスト構造の整理

Awesome・Shoelace両テーマで共通して、分散していたセレクタブロックが1つのブロックへと統合され、CSS Nestingを使った階層構造に整理されました。

Awesomeテーマでは、同一のボタン系セレクタを対象とした2つのブロックが1つにまとめられました。

変更前:

.wa-theme-awesome {
  wa-button,
  button,
  input[type='button'],
  input[type='reset'],
  input[type='submit'],
  a.wa-button {
    --wa-color-shadow: var(--wa-color-border-normal);
    --wa-transition-slow: 0;
    --wa-transition-normal: 0;
    --wa-transition-fast: 0;
    /* ... */
  }

  wa-button,
  button,
  input[type='button'],
  input[type='reset'],
  input[type='submit'],
  a.wa-button {
    &:not([appearance~='plain']):not(.wa-plain) {
      /* ... */
    }
  }
}

変更後:

.wa-theme-awesome {
  wa-button,
  button,
  input:is([type='button'], [type='reset'], [type='submit']),
  a.wa-button {
    /* Match the shadow color to the button's variant */
    --wa-color-shadow: var(--wa-color-border-normal);

    /* Disable transitions for a snappy, tactile feel */
    --wa-transition-slow: 0;
    --wa-transition-normal: 0;
    --wa-transition-fast: 0;

    &:not([appearance='plain'], .wa-plain) {
      /* ... */
    }
  }
}

input[type='button'], input[type='reset'], input[type='submit'] の3行が input:is([type='button'], [type='reset'], [type='submit']) の1行に集約されています。また、:not() セレクタの記法も :not([appearance~='plain']):not(.wa-plain) から :not([appearance='plain'], .wa-plain) へと現代的な構文に更新されています。

Awesomeテーマのフォームコントロールパディング調整

Font Awesomeとの視覚的な一致を高めるため、 --wa-form-control-padding-block--wa-form-control-padding-inline の値が更新されました。

変更前:

--wa-form-control-padding-block: 1em;
--wa-form-control-padding-inline: 1.25em;

変更後:

--wa-form-control-padding-block: 1.375em;
--wa-form-control-padding-inline: 1.5em;

ブロック方向が 1em から 1.375em、インライン方向が 1.25em から 1.5em に拡大され、Font Awesomeのボタンサイズ感に近づきました。

Shoelaceテーマのフォーカススタイル変更

Shoelaceテーマでは、フォーカスリングの定義から color-mix() による透明度処理が取り除かれ、--wa-color-focus がそのまま使われるようになりました。

変更前:

--wa-focus-ring: var(--wa-focus-ring-style) var(--wa-focus-ring-width)
  color-mix(in oklab, var(--wa-color-focus) 60%, transparent);

変更後:

--wa-focus-ring: var(--wa-focus-ring-style) var(--wa-focus-ring-width) var(--wa-color-focus);

この変更により、フォーカスリングの色がShoelaceオリジナルのフォーカススタイルにより近くなります。

バグ修正のまとめ

今回のリファクタリングでは、以下のバグが合わせて修正されました:

  • Awesomeテーマ: <wa-radio appearance="button"> に誤って適用されていた transform プロパティを削除し、水平レイアウトでの表示ずれ(#1766)を解消
  • 両テーマ: <wa-card>appearance 属性が機能しなかった問題を修正
  • Shoelaceテーマ: <wa-callout>size 属性が効かなかった問題を修正
  • Shoelaceテーマ: <wa-combobox> にinput専用のフォーカススタイルを追加
  • Shoelaceテーマ: input[type='range'] のオーバーライドが欠けていた問題を修正
  • Awesomeテーマ: <wa-combobox> にインナーシャドウを追加し、他テキスト系inputと統一

設計判断

CSS Nesting構文と :is() / :not() の積極的な活用 が今回の主要な設計方針です。セレクタの重複排除によってテーマファイルの変更箇所が1箇所に集約され、今後のプロパティ追加・修正の際にセレクタの列挙を繰り返す必要がなくなります。

Shoelaceテーマでは wa-radio[appearance='button'] がボタン系セレクタブロックから分離されました。これはコメントにあるように「フォントサイズを1段階小さくする処理をボタンラベルにのみ適用するため、サイズをプライベートプロパティ --_size に保持する」という仕組みが wa-radio には必要ないためと読み取れます。バグ修正のついでに責務の境界を明確にした形です。

フォーカスリングから color-mix() を除去したことは、カスタムテーマを使うユーザーが --wa-color-focus を上書きする際に意図通りの色がそのまま反映される設計への変更です。60% の透明度が自動的に適用されていた従来の挙動は、テーマ編集者にとって予測しにくい要素でした。

まとめ

セレクタの統合・モダンCSS構文への移行・バグ修正を1つのPRにまとめたことで、テーマファイルの保守性とソース素材との視覚的一致が同時に改善されました。color-mix() の除去やパディング値の再調整といった変更は、テーマのカスタマイズ体験の予測可能性を高める設計判断として注目されます。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
42d61d05

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

ファイル名付きコードブロックの構文(```言語:ファイルパス)は正しく使用されています。また、Issue番号([#1766](URL))やPR番号へのリンクも適切にフォーマットされています。

対象読者への適合性 ✓ PASS

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

CSSのセレクタ、Nesting、カスタムプロパティといった専門的な内容を扱っており、エンジニアという対象読者に適した技術レベルです。不要な初心者向けの説明はありません。

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

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

各セクションの冒頭に要旨が述べられ、各パラグラフもトピックセンテンスで始まる構成になっています。1段落1トピックの原則が守られており、可読性が高いです。

Diff内容との照合 ✓ PASS

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

記事で引用されているコードブロックは、提供されたDiffの内容と正確に一致しています。変更前後のコードが適切に示されており、技術的な変更点を正確に伝えています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

CSS Nesting、:is()/:not()擬似クラス、color-mix()関数など、関連する技術用語が正確かつ文脈に即して使用されています。

説明の技術的正確性 ✓ PASS

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

コード変更に関する説明(セレクタの統合、パディング値の変更、color-mix()の削除など)は、すべてDiffの内容と整合しており、技術的に正確です。

事実の突合 ✓ PASS

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

記事内の主張はすべて、PRのタイトル、説明、およびDiff内のコードやコメントによって裏付けられています。特に設計判断のセクションは、Diff内のコメントを根拠にしており、ハルシネーションは見られません。

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

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

PR番号(#2135)、Issue番号(#1766)、CSSの具体的な数値(パディング値など)はすべて正確に記載されています。

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

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

記事のタイトルはPRのタイトル「Refactor CSS overrides in themes」の内容を正確に反映しており、記事全体の内容とも一致しています。

外部知識の正確性 ✓ PASS

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

記事はPRで提供された情報に限定されており、サポート状況やリリース日程といったPR外の知識を持ち込んでいません。

時間表現の正確性 ✓ PASS

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

PRで修正された既存の問題点について過去形を用いるなど、時間表現はPRの内容と一致しており、正確です。