`<wa-option>` と `<wa-dropdown-item>` の視覚同期と `current` ステート統一

shoelace-style/webawesome

この PR は、<wa-option><wa-dropdown-item> の見た目を統一し、キーボードハイライト時の current ステートを他のフォームコントロールと同様のテーマに合わせ、<wa-select> のリストボックスレイアウトも調整しました。結果として、オプションとメニュー項目が同一プリミティブとして認識され、ビジュアル一貫性が向上します。

背景

Issue #2413 に報告された通り、<wa-option><wa-dropdown-item> が異なるビジュアルを示していたため、同一 UI コンポーネント群としての統一感が欠如していました。特に、リスト内のオプションは角が直線的で背景遷移が遅く、ユーザーが現在位置を把握しづらい状況でした。

同時に、<wa-checkbox><wa-radio><wa-switch><wa-slider> といった フォームコントロールファミリーcurrent(キーボードハイライト)状態で --wa-form-control-activated-color を背景色に、対応するテキストカラーをカスタムプロパティで管理していましたが、<wa-option> はこの統一テーマを利用できていませんでした。

この課題を解決することで、コンポーネント間の視覚的一貫性を保ちつつ、アクセシビリティ向上と開発者体験の改善を狙います。

技術的な変更

PR では 5 つのファイル にわたるスタイルとプロパティの拡張が行われ、<wa-option> の外観と current ステートの挙動が <wa-dropdown-item> と揃えられました。

<wa-option> のスタイル調整

option.styles.ts--current-text-color を定義し、background-colorcolor にそれぞれ --wa-form-control-activated-color--current-text-color を使用するよう変更しました。また、角丸を var(--wa-border-radius-s) に、背景遷移を var(--wa-transition-fast) に統一しています。

@@ -2,6 +2,8 @@ import { css } from 'lit';

 export default css`
   :host {
+    --current-text-color: var(--wa-color-brand-on-loud);
@@ -12,8 +14,9 @@ export default css`
     padding: 0.5em 1em 0.5em 0.25em;
+    border-radius: var(--wa-border-radius-s);
     line-height: var(--wa-line-height-condensed);
-    transition: fill var(--wa-transition-normal) var(--wa-transition-easing);
+    transition: var(--wa-transition-fast) background-color var(--wa-transition-easing);
@@ -30,8 +33,8 @@ export default css`

   :host(:state(current)),
   :host(:state(disabled):state(current)) {
-    background-color: var(--wa-color-brand-fill-loud);
-    color: var(--wa-color-brand-on-loud);
+    background-color: var(--wa-form-control-activated-color);
+    color: var(--current-text-color);
     opacity: 1;
   }

カスタムプロパティの公開

option.ts--current-text-color の CSS プロパティドキュメントが追加され、利用者がテーマごとにテキスト色を上書きできるようになりました。

@@ -30,6 +30,8 @@ import styles from './option.styles.js';
 * @cssstate hover - Like `:hover` but works while dragging in Safari
+ *
+ * @cssproperty --current-text-color - The text color of the current (highlighted) option, paired with `--wa-form-control-activated-color`.

<wa-select> のリストボックスレイアウト

select.styles.ts ではリストボックスのパディングを統一の 0.25em に変更し、スロットされたオプションを フレックスカラム として gap: 0.125em で間隔を付与しました。これにより、丸みを帯びたオプションがリストボックス内にきれいに収まり、ホバー状態と current 状態が隣接しても視認性が保たれます。

@@ -256,8 +256,7 @@ export default css`
-    padding-block: 0.5em;
-    padding-inline: 0;
+    padding: 0.25em;
@@ -270,6 +269,13 @@ export default css`
     }
   }

+  /* Space options with half the listbox's padding */
+  .listbox slot:not([name]) {
+    display: flex;
+    flex-direction: column;
+    gap: 0.125em;
+  }
+
   slot:not([name])::slotted(small) {
     display: block;
     font-size: var(--wa-font-size-smaller);

テーマ固有の上書き

awesome.css では --current-text-color のデフォルトを --wa-color-surface-default に上書きし、活性化背景色がニュートラルに見えるよう調整しています。

@@ -577,6 +577,10 @@
       --checked-icon-color: var(--wa-color-surface-default);
     }

+    wa-option {
+      --current-text-color: var(--wa-color-surface-default);
+    }
+
     wa-switch {
       --height: 1.5em;

以上の変更により、<wa-option><wa-dropdown-item> と同一のビジュアルプリミティブとして機能し、current 状態のカラーリングが他のフォームコントロールと統一されました。

設計判断

同一プリミティブへの統合 を最優先とし、既存の :state(current) を拡張する方針が採られました。新たにコンポーネント固有のステートを増やすのではなく、カスタムプロパティで色調整を行うことで、テーマごとの上書きが容易になり、後方互換性が保たれます。

また、CSS カスタムプロパティ を用いたテキストカラーの抽象化は、テーマエンジン全体で一貫したデザイントークンを共有できるという利点を持ち、将来的なカラーパレット変更やアクセシビリティ調整を最小のコード変更で実現可能にします。

リストボックスのレイアウト変更は、パディングとフレックスギャップ というシンプルな手段で実装され、レイアウトロジックへの侵入を最小限に抑えつつ、視覚的な統一感を提供します。これにより、開発者は既存の API を変更せずに新しいビジュアルを利用でき、マイグレーションコストが低減します。

まとめ

本 PR は <wa-option><wa-dropdown-item> の外観を揃え、current ステートのテーマ統一と <wa-select> のリストボックスレイアウトを刷新したことで、Web Awesome のコンポーネント群全体に一貫したビジュアル言語を提供します。カスタムプロパティと既存ステートの拡張という設計選択により、互換性と拡張性を両立させた実装となっています。

記事メタデータ

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

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

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

リード文・背景・技術的変更・設計判断・まとめの5部構成があり、総論→各論→結論の流れが明確です。

カスタムMarkdown構文 ⚠ WARNING

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

GitHubリンクが要求形式([#123](URL))になっておらず、Issueリンクも同様です。コードブロックはdiff形式で正しく記述されています。

対象読者への適合性 ✓ PASS

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

専門的なウェブコンポーネント開発者向けで、初心者向けの過剰な説明はありません。

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

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

各セクションが総論・各論・結論のパラグラフで構成され、1文目がトピックセンテンスになっています。段落長も適切です。

Diff内容との照合 ✓ PASS

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

記事中のdiffブロックは提供されたDiffと完全に一致しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

PRで使用されている `--current-text-color` や `--wa-form-control-activated-color` などの用語が正確に記述されています。

説明の技術的正確性 ✓ PASS

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

変更内容の効果や理由がPR説明と矛盾せず、技術的に正しい記述です。

事実の突合 ✓ PASS

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

全ての主張がPRタイトル、説明、Diffで裏付けられており、捏造や推測はありません。

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

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

「5 つのファイル」や CSS プロパティの値など、数値・固有名詞は正確です。

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

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

記事タイトルはPRの内容(ビジュアル同期と current ステート統一)を適切に要約しています。

外部知識の正確性 ✓ PASS

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

バージョンサポートやリリース日程等、PRに記載されていない外部情報は含まれていません。

時間表現の正確性 ✓ PASS

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

時間表現の歪曲はなく、PRの記述と一致しています。