ドキュメント例をComboboxに置き換え、多数のオプション表示を改善

shoelace-style/webawesome

WebAwesomeのドキュメントにおいて、選択肢が多い例では wa-combobox を使用するように変更されました。これにより、長いオプションリストでも検索・フィルタリングが可能になり、ユーザー体験が向上します。

背景

ドキュメントの対話的な例では、アニメーション名やイージング関数、配置オプションなどを選択するために wa-select コンポーネントが使用されていました。Animationドキュメントでは数十種類のアニメーション名とイージング関数から選択する必要があり、Popupドキュメントでは12種類の配置オプション(toptop-startbottom-end など)を提供していました。

通常のセレクトボックスでは、選択肢が増えるとスクロールが必要になり、目的のオプションを見つけにくくなります。特にアニメーション名のように数が多く、名前で探したい場合には不便でした。#1977は、この問題に対処するためにコンポーネントを切り替えています。

技術的な変更

主な変更は2つの領域で行われました。Pro版コンポーネントの動的ロードと、ドキュメント例の書き換えです。

Pro版Comboboxコンポーネントの動的ロード

wa-combobox はPro版コンポーネントであるため、フリー版リポジトリで動作させるための仕組みが追加されました。

変更後:

const proComponents = [
  "combobox",
  "page"
]

const kitCode = "f4ea8aaaeb9d4f12"

proComponents.forEach((tagName) => {
  if (!customElements.get("wa-" + tagName)) {
    import(`https://ka-p.webawesome.com/kit/${kitCode}/webawesome@{{ package.version }}/components/${tagName}/${tagName}.js`)
      .catch((e) => {
        // known errors with dual registration. This is only a thing in the free repo.
      })
  }
})

Pro版コンポーネントのリストを定義し、各コンポーネントが未登録の場合のみ動的にインポートする仕組みです。コメントにあるように、これはフリー版リポジトリでローカル実行するための暫定的な実装で、シングルトンの動作やコンポーネントの二重読み込みに関する既知の問題があります。

Animationドキュメントの例の書き換え

アニメーション名とイージング関数の選択に wa-combobox が適用されました。

変更後:

<div class="animation-sandbox-combobox">
  <wa-animation name="bounce" easing="ease-in-out" duration="2000" play>
    <div class="box"></div>
  </wa-animation>

  <div class="controls">
    <wa-combobox label="Animation" placeholder="Select animation..."></wa-combobox>
    <wa-combobox label="Easing" placeholder="Select easing..."></wa-combobox>
    <wa-input label="Playback Rate" type="number" min="0" max="2" step=".25" value="1"></wa-input>
  </div>
</div>

スクリプト部分では、getAnimationNames()getEasingNames() から取得したリストを使って wa-option 要素を動的に生成し、Comboboxに追加します。

await customElements.whenDefined('wa-combobox');
await customElements.whenDefined('wa-option');

const animations = getAnimationNames();
const easings = getEasingNames();

animations.forEach(name => {
  const option = document.createElement('wa-option');
  option.value = name;
  option.textContent = name;
  animationName.append(option);
});

カスタム要素の定義完了を待ってから要素を生成することで、確実に動作するようにしています。

Popupドキュメントの例の書き換え

配置オプションの選択にも同様の変更が適用されました。

変更前:

<wa-select label="Placement" name="placement" value="top" class="popup-overview-select">
  <wa-option value="top">top</wa-option>
  <wa-option value="top-start">top-start</wa-option>
  <wa-option value="top-end">top-end</wa-option>
  <!-- ... 12個のオプション -->
</wa-select>

変更後:

<wa-combobox label="Placement" name="placement" placeholder="Select placement..." class="popup-overview-select"></wa-combobox>

HTMLから冗長なオプション定義がなくなり、JavaScriptで動的に生成される形になりました。

const placements = ['top', 'top-start', 'top-end', 'bottom', 'bottom-start', 'bottom-end', 'right', 'right-start', 'right-end', 'left', 'left-start', 'left-end'];

placements.forEach(value => {
  const option = document.createElement('wa-option');
  option.value = value;
  option.textContent = value;
  placement.append(option);
});

配置オプションのリストを配列で定義し、ループ処理でオプションを追加することで、HTMLの記述量が大幅に削減されています。

設計判断

既存の wa-select を置き換える方式が採用されました。

ドキュメント内の例を更新する際、wa-selectwa-combobox を併用する選択肢もありましたが、すべての該当箇所で wa-combobox に統一されています。これにより、ユーザーは一貫したインターフェースで多数のオプションから選択できます。

また、オプションの定義を動的生成に変更することで、HTMLの可読性が向上し、メンテナンスも容易になりました。配置オプションやアニメーション名のような定型的なリストは、JavaScriptの配列やAPIから取得する方が変更に強い構造です。

本PRは、ドキュメントの対話的な例における選択UI を改善した変更です。多数のオプションを扱う場面で検索・フィルタリング可能な wa-combobox に切り替えることで、ユーザーが目的の値を素早く見つけられるようになりました。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

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

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

対象読者への適合性 ✓ PASS

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

Webコンポーネントやフロントエンド開発に関する知識を持つエンジニアを対象としており、専門用語の使用や説明の粒度が適切です。

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

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

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

Diff内容との照合 ✓ PASS

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

記事内のコード引用は、提供されたDiffの内容を正確に反映しています。一部のコードは要点を伝えるために適切に省略されていますが、技術的な意味合いは損なわれていません。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「wa-combobox」「動的インポート」「カスタム要素」などの技術用語が文脈に応じて正確に使用されています。

説明の技術的正確性 ✓ PASS

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

Pro版コンポーネントの動的ロードや、オプションの動的生成に関する説明は、Diffの内容と整合しており、技術的に正確です。

事実の突合 ⚠ WARNING

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

記事の主張のほとんどはPR情報で裏付けられていますが、「設計判断」セクションの内容はPRに明記されておらず、コード変更からの推測に基づいています。内容は妥当ですが、厳密には推測の域を出ません。

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

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

PR番号(#1977)やコード内の定数(kitCodeなど)が、提供された情報と正確に一致しています。

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

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

記事のタイトル「ドキュメント例をComboboxに置き換え、多数のオプション表示を改善」は、PRのタイトルと内容を的確に要約しています。

外部知識の正確性 ✓ PASS

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

バージョンサポート状況やリリース日程など、PR情報に基づかない外部知識の追記は見られませんでした。

時間表現の正確性 ✓ PASS

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

「既に」「近い将来」といった時間表現の歪曲はなく、事実関係が正確に記述されています。