`<wa-input>` と `<wa-combobox>` の `autocorrect` 型修正と仮想キーボード対応プロパティの追加

shoelace-style/webawesome

<wa-input>autocorrect プロパティが文字列ユニオン型からboolean型に修正され、<wa-combobox> にも仮想キーボードをカスタマイズするための複数プロパティが追加されました。

背景

autocorrect はHTMLの属性値として "off" / "on" の文字列を取りますが、Webコンポーネントのプロパティとしてはboolean型で扱う方が自然です。これまで <wa-input> では autocorrect: 'off' | 'on' という文字列ユニオン型で定義されており、プロパティとして利用する際にboolean型との使い勝手の不一致が生じていました。同様に、<wa-combobox> では仮想キーボード制御に関わる autocapitalizeautocorrectenterkeyhintinputmodespellcheck の各プロパティが不足しており、モバイル環境での入力体験を細かく制御できない状況でした。

また、<wa-combobox> には autocomplete プロパティが存在していましたが、これはブラウザネイティブのHTML属性と名前が衝突し、意図しない動作を引き起こす可能性がありました。

技術的な変更

input.ts における autocorrect の型定義が、カスタムコンバーターを持つboolean型プロパティに変更されました。これにより、HTML属性としては従来通り "off" / "on" 文字列を受け付けつつ、JavaScriptプロパティとしては true / false で扱えるようになっています。

変更前:

/** Indicates whether the browser's autocorrect feature is on or off. */
@property() autocorrect: 'off' | 'on';

変更後:

/**
 * Indicates whether the browser's autocorrect feature is on or off. When set as an attribute, use "off" or "on".
 * When set as a property, use true or false.
 */
@property({
  type: Boolean,
  converter: {
    fromAttribute: value => (!value || value === 'off' ? false : true),
    toAttribute: value => (value ? 'on' : 'off'),
  },
})
declare autocorrect: boolean;

fromAttribute では、属性値が null(属性なし)または 'off' の場合に false を返し、それ以外を true とすることで、属性の省略をオフ扱いに統一しています。toAttribute ではboolean値をブラウザが解釈できる 'on' / 'off' 文字列に変換して出力します。

テンプレート側のバインディングも合わせて修正されています。

変更前:

autocorrect=${ifDefined(this.autocorrect)}

変更後:

autocorrect=${this.autocorrect ? 'on' : 'off'}

ifDefined を外したことで、autocorrect は常にネイティブ <input> に明示的に設定されます。boolean型に変わったことで undefined が入らなくなったため、ifDefined を使う必要がなくなりました。

changelogによると、<wa-combobox> には autocapitalizeautocorrectenterkeyhintinputmodespellcheck の各プロパティが追加され、仮想キーボードの挙動をコンポーネント側から制御できるようになっています。また、ネイティブHTML属性と名前が衝突していた autocomplete プロパティは削除されました。

設計判断

属性とプロパティのデュアルインターフェースを維持しながら、JavaScriptからの利用においてboolean型を採用した点が重要な設計判断です。Lit の @property デコレーターのカスタムコンバーター機能を活用することで、HTMLテンプレートからの属性指定(autocorrect="off")とJavaScriptからのプロパティ操作(el.autocorrect = false)の両方を自然な形でサポートしています。

autocomplete プロパティを <wa-combobox> から削除した判断は、WebコンポーネントとネイティブHTML仕様の共存において典型的なトレードオフを示しています。コンボボックスは独自の補完ロジックを持つコンポーネントであり、ブラウザのネイティブオートコンプリートと同名のプロパティを持つことは予期しない動作の原因になり得ます。削除によって仕様の曖昧さを排除し、コンポーネントの責務を明確にしています。

まとめ

autocorrect の型をboolean型に統一したことで、<wa-input> はJavaScriptの慣習に沿ったAPIを提供しつつ、HTMLの仕様とも整合性を保つようになりました。<wa-combobox> への仮想キーボード関連プロパティの追加と autocomplete の削除は、ネイティブHTML属性との共存を慎重に設計した結果であり、Webコンポーネントにおけるプロパティ設計の実践的な指針となる変更です。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
c8e7dee5

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

ファイル名付きのシンタックスハイライト(```typescript:...)およびPR番号のリンク記法が正しく使用されています。

対象読者への適合性 ✓ PASS

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

Litコンポーネントのプロパティ定義やカスタムコンバーターに関する内容であり、専門知識を持つエンジニアという対象読者に適合しています。

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

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

各セクション、各パラグラフが「総論→各論」の構成になっており、トピックセンテンスが明確です。1段落1トピックの原則も守られており、可読性が高いです。

Diff内容との照合 ✓ PASS

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

記事内で引用されているすべてのコードブロックは、提供されたDiff情報と完全に一致しており、正確に内容を反映しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「文字列ユニオン型」「カスタムコンバーター」「@property デコレーター」など、LitやTypeScriptに関する技術用語が正確かつ適切に使用されています。

説明の技術的正確性 ✓ PASS

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

プロパティの型変更の理由や、カスタムコンバーターの動作、テンプレートバインディングの変更理由についての説明は、技術的に正確で論理的です。

事実の突合 ✓ PASS

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

記事内のすべての主張は、提供されたPRのDiff情報(changelog.md, input.ts)で裏付けられており、ハルシネーションは検出されませんでした。

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

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

PR番号(#2200)やコンポーネント名(`<wa-input>`など)、プロパティ名がすべて正確に記載されています。

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

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

記事のタイトルは、PRで行われた主要な変更(autocorrectの型修正、comboboxへのプロパティ追加)を正確に要約しており、PR内容と一致しています。

外部知識の正確性 ✓ PASS

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

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

時間表現の正確性 ✓ PASS

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

PRは完了した変更であり、記事も「〜されました」という過去形・完了形で記述されており、時間表現は正確です。