`<wa-number-input>`の追加による数値入力の標準化

shoelace-style/webawesome

Web Awesome 3.2では、ステッパーボタンを備えた数値入力コンポーネント <wa-number-input> が実験的機能として追加されました。これにより、Kickstarterストレッチゴールの5番目のコンポーネントとして、フォーム制御要素の充実が図られます。

背景

Web Awesomeは、Kickstarterプロジェクトにおいて14個の新規コンポーネント追加をストレッチゴールとして掲げており、#1076でその進捗が管理されています。今回の<wa-number-input>が5番目のコンポーネントとして実装され、#1688でトラッキングされていた作業が完了しました。

数値入力は多くのWebアプリケーションで必要とされる基本的なUI要素ですが、ブラウザネイティブの<input type="number">には、スタイリングの制約やクロスブラウザでの一貫性の問題がありました。専用コンポーネントの追加により、Web Awesomeの設計思想に沿った統一的なUIを提供できます。

技術的な変更

コンポーネントの実装

packages/webawesome/src/components/number-input/number-input.tsに新規ファイルが追加され、381行のコンポーネント実装が含まれています。コンポーネントは WebAwesomeFormAssociatedElement を継承しており、標準的なフォーム制御要素として機能します。

主要なプロパティ:

@property({ type: Number }) min?: number;
@property({ type: Number }) max?: number;
@property({ type: Number }) step = 1;
@property({ type: Boolean, attribute: 'without-steppers' }) withoutSteppers = false;
@property() inputmode: 'numeric' | 'decimal' = 'numeric';

これらのプロパティにより、最小値・最大値の制約、ステップ幅の指定、ステッパーボタンの表示/非表示、キーボードタイプの制御が可能です。

スタイリングシステム

packages/webawesome/src/components/number-input/number-input.styles.tsには246行のスタイル定義があり、Web Awesomeの既存のデザイントークンを活用しています。

.number-field {
  display: flex;
  align-items: stretch;
  justify-content: start;
  height: var(--wa-form-control-height);
  border-color: var(--wa-form-control-border-color);
  border-radius: var(--wa-form-control-border-radius);
}

appearance 属性(outlined/filled)に応じた外観の切り替えや、pill 属性による角丸表示、size 属性(small/medium/large)によるサイズバリエーションをサポートしています。

ステッパーボタンのアイコン

packages/webawesome/src/components/icon/library.system.tsに、ステッパーボタン用の plus アイコンが追加されました。既存の minus アイコンと組み合わせて、増減ボタンに使用されます。

plus: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2026 Fonticons, Inc.--><path fill="currentColor" d="M352 128C352 110.3 337.7 96 320 96C302.3 96 288 110.3 288 128L288 288L128 288C110.3 288 96 302.3 96 320C96 337.7 110.3 352 128 352L288 352L288 512C288 529.7 302.3 544 320 544C337.7 544 352 529.7 352 512L352 352L512 352C529.7 352 544 337.7 544 320C544 302.3 529.7 288 512 288L352 288L352 128z"/></svg>`

国際化対応

多くの言語ファイルに、ステッパーボタンのアクセシビリティラベル用の翻訳が追加されています。

increment: 'Increment',
decrement: 'Decrement'

これにより、スクリーンリーダーユーザーが各ボタンの機能を理解できるようになります。Diffからは、アラビア語、チェコ語、デンマーク語、ドイツ語、英語、スペイン語、ペルシア語、フィンランド語、フランス語、ヘブライ語、ヒンディー語、クロアチア語、ハンガリー語、インドネシア語、イタリア語、日本語、カザフ語、ノルウェー語(ブークモール)、オランダ語、ノルウェー語(ニーノシュク)、ポーランド語、ポルトガル語の翻訳ファイルが更新されたことが確認できます。

テストカバレッジ

packages/webawesome/src/components/number-input/number-input.test.tsには598行のテストコードが含まれており、以下の観点がカバーされています:

  • アクセシビリティ検証
  • デフォルトプロパティの確認
  • フォーム送信時の値のシリアライゼーション
  • min/max/step制約の動作
  • ステッパーボタンのクリック操作
  • キーボード操作(上下矢印キー)
  • 無効化・読み取り専用状態
  • カスタム状態(blank、invalid)

ドキュメントとナビゲーション

packages/webawesome/docs/docs/components/number-input.mdに226行のドキュメントページが追加され、使用例やAPIリファレンスが提供されています。サイドバーナビゲーション(docs/_includes/sidebar.njk)では、計画中を示す plannedBadge が削除され、通常のリンクに変更されました。

-<li><span class="is-planned wa-split">Number Input <a href="https://github.com/shoelace-style/webawesome/issues/1688" target="_blank">{{ plannedBadge("A Web Awesome Kickstarter stretch goal!") }}</a></span></li>
+<li><a href="/docs/components/number-input">Number Input</a></li>

設計判断

フォーム統合の優先

コンポーネントは WebAwesomeFormAssociatedElement を基底クラスとして採用しており、標準的なHTML5フォーム検証やフォーム送信との統合が最初から考慮されています。MirrorValidatorによる制約検証により、min/maxなどの属性が自動的にバリデーションロジックに反映されます。

ステッパーボタンのオプション化

without-steppers 属性の提供により、ステッパーボタンの表示を制御できます。これは、画面スペースが限られたモバイル環境や、キーボード入力を主とするデスクトップ環境での柔軟な使い分けを可能にする判断です。

実験的ステータスの付与

@status experimentalのタグが付与されており、APIの安定性が保証されていないことが明示されています。コンポーネント定義の冒頭にこのアノテーションを配置することで、ドキュメント生成時に自動的に警告が表示される仕組みです。

inputmode属性のデフォルト値

inputmodeのデフォルト値として numeric が選択されました。これにより、モバイルデバイスで数値専用キーボードが表示されます。小数点入力が必要な場合はdecimalに変更できる設計となっています。

まとめ

本PRは、Web AwesomeのKickstarterストレッチゴール達成に向けた重要なマイルストーンです。フォーム統合、国際化、アクセシビリティ、テストカバレッジのすべてにおいて、既存コンポーネントと同等の品質基準を満たす実装となっています。実験的ステータスでのリリースにより、ユーザーフィードバックを収集しながらAPIの成熟度を高めていく段階的なアプローチが採られています。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

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

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

リード文(総論)→背景・技術詳細・設計判断(各論)→まとめ(結論)という「総論→各論→結論」の構成が明確に適用されており、非常に分かりやすいです。

カスタムMarkdown構文 ✓ PASS

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

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

対象読者への適合性 ✓ PASS

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

Web Componentsやフォーム制御に関する専門用語を適切に使用しており、専門知識を持つエンジニアという対象読者に適合した内容です。

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

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

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

Diff内容との照合 ✓ PASS

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

記事内で引用されているコードブロック(プロパティ定義、CSS、アイコンSVG、Diff)は、すべて提供されたDiff情報と正確に一致しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「WebAwesomeFormAssociatedElement」「MirrorValidator」「@status experimental」など、ライブラリ固有の技術用語を正確に使用しています。

説明の技術的正確性 ✓ PASS

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

コンポーネントの継承関係やバリデーションの仕組みに関する説明は、Diff内のコードと整合性が取れており、技術的に正確です。

事実の突合 ✓ PASS

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

「Kickstarterストレッチゴールの5番目」という背景や、各ファイルの追加行数、国際化対応された言語リストなど、記事内のすべての主張がPR DescriptionやDiff情報によって裏付けられています。

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

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

PR番号(#1990)、Issue番号(#1076, #1688)、バージョン(3.2)、各ファイルの行数など、すべての数値や固有名詞が正確です。

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

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

記事タイトル「`<wa-number-input>`の追加による数値入力の標準化」は、PRの主題であるコンポーネント追加とその目的を的確に表現しています。

外部知識の正確性 ✓ PASS

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

記事の内容はすべてPR情報(Description, Diff)に基づいており、PRに記載のない外部知識の追加(捏造)は見られません。

時間表現の正確性 ✓ PASS

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

コンポーネントが「追加されました」、計画中から「変更されました」など、PRの完了した内容を反映した正確な時間表現が用いられています。