カラーピッカーのスウォッチにラベルサポートを追加

shoelace-style/webawesome

<wa-color-picker>swatches プロパティが { color, label } オブジェクトの配列を受け付けるようになり、スクリーンリーダーがカラースウォッチをより意味のある名前で読み上げられるようになりました。

背景

#2067 で指摘されていた通り、従来のカラースウォッチはスクリーンリーダーに対してカラーコードの生の値(#d0021b など)をそのまま読み上げていました。カラーコードは視覚的に識別できるユーザーには問題ありませんが、スクリーンリーダー利用者にとっては色の名前や意味を伝えられないアクセシビリティ上の課題がありました。

この変更はそのギャップを埋めるもので、開発者がスウォッチごとに人間が読みやすいラベルを任意で付与できるようにします。

技術的な変更

WaColorPickerSwatch インターフェースが新たに定義され、swatches プロパティの型シグネチャが拡張されました。内部では全フォーマットを統一して処理するための正規化ロジックが追加されています。

新規インターフェース定義(color-picker.ts):

export interface WaColorPickerSwatch {
  color: string;
  label: string;
}

swatches プロパティの型拡張:

// 変更前
@property() swatches: string | string[] = '';

// 変更後
@property() swatches: string | string[] | WaColorPickerSwatch[] = '';

レンダリング時には、受け取った全フォーマットを WaColorPickerSwatch[] に正規化する処理が追加されています。文字列配列の場合は { color: s, label: s } に、セミコロン区切りの文字列の場合も同様に変換されます。{ color, label } オブジェクトの場合はそのまま利用されます。

// 変更前
const swatches = Array.isArray(this.swatches)
  ? this.swatches // allow arrays for legacy purposes
  : this.swatches.split(';').filter(color => color.trim() !== '');

// 変更後
const normalizedSwatches: WaColorPickerSwatch[] = Array.isArray(this.swatches)
  ? this.swatches.map(s => (typeof s === 'string' ? { color: s, label: s } : s))
  : this.swatches
      .split(';')
      .filter(color => color.trim() !== '')
      .map(color => ({ color: color.trim(), label: color.trim() }));

ラベル付きスウォッチを使用する際のAPIは以下のとおりです:

<wa-color-picker id="labeled-swatches" label="Select a color"></wa-color-picker>

<script>
  const colorPicker = document.getElementById('labeled-swatches');
  colorPicker.swatches = [
    { color: '#d0021b', label: 'Red' },
    { color: '#f5a623', label: 'Orange' },
    { color: '#7ed321', label: 'Green' },
    { color: '#4a90e2', label: 'Blue' }
  ];
</script>

既存の文字列・文字列配列フォーマットは引き続きそのまま動作するため、後方互換性は完全に維持されています。

設計判断

ラベルはオプション扱いとされており、既存のフォーマットを使い続ける場合はカラーコードがそのままフォールバックラベルとして使用されます。これは、ラベルなし(従来通り)とラベルあり(アクセシブル)の両方のユースケースを単一の正規化パスで処理できる設計です。

全フォーマットを内部で WaColorPickerSwatch[] に統一する正規化アプローチにより、レンダリングロジックの分岐を最小化しています。変数名も swatches から normalizedSwatches に変更されており、「この時点以降は常に統一フォーマット」という意図がコード上で明示されています。

WaColorPickerSwatch インターフェースは export されているため、TypeScriptを利用する開発者は型安全にスウォッチ配列を構築できます。

まとめ

本PRは、既存のAPIを壊すことなく WaColorPickerSwatch インターフェースの導入と入力正規化ロジックの追加だけでアクセシビリティを向上させた変更です。カラーピッカーを使用するプロダクトがスクリーンリーダー対応を必要とする場合、ラベルを付与するだけで対応できるようになります。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
5d3948a5

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

ファイル名付きシンタックスハイライト、GitHubのPR・Issueリンク記法ともに正しく使用されています。

対象読者への適合性 ✓ PASS

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

インターフェース定義や型シグネチャの変更など、専門知識を持つエンジニア向けの内容が過不足なく記述されており、対象読者に完全に適合しています。

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

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

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

Diff内容との照合 ✓ PASS

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

Diff内のコード変更(インターフェース定義、プロパティの型拡張、正規化ロジック)を正確に引用しています。API使用例のコードは要点を絞るために適切に簡略化されており、理解を助けています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「インターフェース」「正規化」「後方互換性」などの技術用語が文脈に応じて正確に使用されています。

説明の技術的正確性 ✓ PASS

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

コード変更の意図や動作に関する説明は、Diffの内容と完全に一致しており、技術的に正確です。

事実の突合 ✓ PASS

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

記事内のすべての主張は、PRのDescriptionやDiff内のコードで裏付けられており、ハルシネーションは検出されませんでした。

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

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

PR番号(#2164)やIssue番号(#2067)などの数値・固有名詞は正確に記載されています。

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

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

記事のタイトル「カラーピッカーのスウォッチにラベルサポートを追加」は、PRのタイトル「Add label support to color picker swatches」の内容を正確に反映しています。

外部知識の正確性 ✓ PASS

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

記事はPR情報に基づいており、バージョンサポート状況やリリース日程など、PRに記載のない外部知識の追記はありません。

時間表現の正確性 ✓ PASS

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

「従来の」「この変更は」といった時間に関する表現は、PRの文脈と一致しており正確です。