ネイティブ `<select>` スタイルの2つのバグを修正

shoelace-style/webawesome

ネイティブスタイルユーティリティにおける <select> 要素の表示崩れ2件が修正されました。選択テキストがキャレットアイコンと重なる問題と、multiple 属性を持つ <select> が正しく展開されない問題が解消されています。

背景

#2193 で報告された通り、ネイティブスタイルユーティリティの <select> 要素には2つの独立したバグが存在していました。

1つ目は、選択中のオプション名が長い場合にキャレットアイコンの下に文字が潜り込む問題です。<select> の右端には背景画像としてキャレットアイコンが配置されていますが、テキストがそのアイコン領域まで伸びることを防ぐパディングが不足していました。

2つ目は、multiple 属性を持つ <select> が単一行のまま表示される問題です。通常の <select> 向けに設定された固定高さやスタイルが <select multiple> にもそのまま継承されるため、複数行の選択肢が表示されませんでした。

技術的な変更

packages/webawesome/src/styles/native.css における <select> のスタイル定義が修正され、2つのバグがそれぞれ独立したCSSの変更によって解消されました。

問題1の修正(テキストとアイコンの重複):

変更前:

position: relative;

min-width: 0;
overflow: hidden;

background-image: var(--icon-caret), var(--icon-caret);
background-repeat: no-repeat;
background-position: center right var(--wa-form-control-padding-inline);
background-blend-mode: hue, difference;
background-size: 1rem 1rem;

cursor: pointer;

変更後:

position: relative;

min-width: 0;
background-image: var(--icon-caret), var(--icon-caret);
background-repeat: no-repeat;
background-position: center right var(--wa-form-control-padding-inline);
background-blend-mode: hue, difference;
background-size: 1rem 1rem;
text-overflow: ellipsis;
padding-inline-end: calc(var(--wa-form-control-padding-inline) + 1rem + var(--wa-space-xs));
overflow: hidden;

cursor: pointer;

&[multiple] {
  height: auto;
  background-image: none;
  padding-inline: var(--wa-form-control-padding-inline);
}

padding-inline-endcalc(var(--wa-form-control-padding-inline) + 1rem + var(--wa-space-xs)) を設定することで、キャレットアイコン(1rem)と余白(--wa-space-xs)分だけ追加のスペースを確保しています。また text-overflow: ellipsis を加えることで、それでもテキストが溢れる場合は省略記号で切り詰めるようになります。なお、overflow: hidden の宣言位置がキャレット背景画像の定義より後に移動していますが、これは text-overflow: ellipsispadding-inline-end の追加に合わせてプロパティを論理的にグループ化したものです。

問題2の修正(multiple 属性時の展開):

&[multiple] セレクタで height: auto を指定し、単一選択時に設定された固定高さを上書きしています。また background-image: none でキャレットアイコンを非表示にし、padding-inline を均等なフォームコントロール用パディングに戻すことで、複数選択リストとして自然な見た目になります。

設計判断

&[multiple] のネストセレクタを用いた上書き方式が採用されました。

単一 <select><select multiple> は見た目や操作感が大きく異なりますが、両者に共通するスタイル(borderfontcolor など)は多く存在します。そのため、共通スタイルをベースとして定義し、multiple 属性を持つ場合のみ差分を上書きするアプローチは、CSSの重複を避ける上で自然な選択です。キャレットアイコンは単一選択時の「開く」操作を示すUIヒントですが、multiple ではブラウザネイティブのリスト表示となるため不要であり、background-image: none での除去も理にかなっています。

まとめ

今回の修正は、CSS設計プロパティ3つ(padding-inline-endtext-overflowoverflow)の追加と、属性セレクタによる multiple 専用スタイルの追加という最小限の変更で2件のバグを解消しています。キャレットアイコンのサイズをデザイントークンと calc() で動的に計算するアプローチにより、フォームコントロールのパディングが変更された場合でも正しいオフセットが自動的に維持されます。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
4f0f3863

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

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

「リード文(総論)→背景・技術詳細(各論)→まとめ(結論)」の構成が明確であり、任意項目の「設計判断」も含まれているため、非常に分かりやすい記事構成です。

カスタムMarkdown構文 ✓ PASS

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

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

対象読者への適合性 ✓ PASS

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

CSSのプロパティやセレクタに関する具体的な解説となっており、専門知識を持つエンジニアという対象読者に完全に適合しています。

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

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

各セクションが総論→各論で構成され、各段落はトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が非常によく守られています。可読性が高いです。

Diff内容との照合 ✓ PASS

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

記事内のコードブロックは、提供されたDiffの内容を正確に反映しています。読者の理解を助けるために周辺コードを含んでいますが、変更点はすべてDiffと一致しており、適切な引用です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`padding-inline-end`, `text-overflow`, `calc()`, 属性セレクタなどのCSS関連の技術用語が正確かつ適切に使用されています。

説明の技術的正確性 ✓ PASS

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

CSSプロパティの変更がもたらす効果(パディングによるスペース確保、`height: auto`による高さの上書きなど)についての説明が、技術的に正確かつ論理的です。

事実の突合 ✓ PASS

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

記事で説明されている2つのバグ修正は、PRのchangelog.mdのDiff内容と完全に一致しています。「設計判断」セクションはコードの構造から読み取れる妥当な解説であり、ハルシネーションは見られません。

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

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

PR番号(#2219)とIssue番号(#2193)が正確に記載・リンクされています。

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

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

記事のタイトル「ネイティブ `<select>` スタイルの2つのバグを修正」は、PRのタイトル「Fix native select styles」の内容をより具体的に、かつ正確に表現しており、非常に秀逸です。

外部知識の正確性 ✓ PASS

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

PR情報に記載のないバージョン情報やリリース予定日など、外部知識の追加はありません。

時間表現の正確性 ✓ PASS

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

「修正されました」「解消されています」といった過去形の表現が使われており、完了した変更を説明する文脈として時間表現は正確です。