Known Date と Time Picker コンポーネントの追加と関連インフラの拡充

shoelace-style/webawesome

Web Awesome 3.8 で、日付入力を分割フィールドで扱う <wa-known-date> と、ロケール対応のセグメント化時間入力 <wa-time-picker> が本体に実装されました。これにより、ユーザーが既知の日付や時間を正確に入力できる UI が標準コンポーネントとして提供され、国際化・アクセシビリティも同時に強化されています。

背景

既存の <wa-date-input> はポップアップカレンダー中心の UI であり、既に分かっている日付(例: 生年月日やパスポート発行日)を入力させるユースケースに適していませんでした。加えて、時間入力は高度なロケール表記(12 時制/24 時制、秒・AM/PM の有無)を統一的に扱う仕組みが欠如していました。これらのギャップを埋めるために、本 PR は 新規ピッカーコンポーネント共通セグメントコントローラ を導入し、ドキュメント・サイドバー・翻訳まで一括で更新しています。

技術的な変更

新コンポーネント実装

WaKnownDate は 3 つのテキストフィールド(day, month, year)をロケールに応じた順序で配置し、value プロパティは ISO 8601 形式の文字列 (YYYY-MM-DD) で保持します。

+export class WaKnownDate extends WebAwesomeFormAssociatedElement { ... }

内部ロジックは field-order.tsIntl.DateTimeFormat.formatToParts を利用し、localeFieldOrder(locale)['day','month','year'] などの順序配列を返すことで実装されています。

+export function localeFieldOrder(locale: string): SegmentField[] { ... }

入力値の妥当性は PartialDateValidator が担当し、部分入力や不正な日付に対して valueMissingbadInput を返します。

+export const PartialDateValidator = (): Validator => { ... }

WaTimePicker は時間セグメント(hour, minute, optional second, optional dayPeriod)をロケール順に配置し、<wa-popup> と連動したカラム式選択 UI を提供します。時間モデルは time-segments.ts に純粋関数として切り出され、wireToTimeSegments / timeSegmentsToWire が 24 時制のワイヤ形式 (HH:mm[:ss]) と UI 表示形式の相互変換を行います。

+export interface TimeSegments { hour: number | null; minute: number | null; ... }

共通 SegmentedFieldController

両コンポーネントは SegmentedFieldController を利用して、キー入力、フォーカスローテーション、バッファ管理、RTL 反転等の汎用ロジックを共有します。コントローラは SegmentLayout(ロケール由来の順序・リテラル)をキャッシュし、テスト用に clearTimeSegmentLayoutCache() が提供されています。

+export class SegmentedFieldController implements ReactiveController { ... }

i18n と UI 微調整

  • 翻訳ファイル (ar.ts, cs.ts, da.ts, de-ch.ts) に amchooseDatecloseTimePicker などのキーが追加され、ピッカーのアクセシビリティヘルプやボタンラベルがローカライズされました。
  • アイコン SVG ライブラリに calendarclock が追加入稿され、icon.styles.tssvg { fill: currentColor; } によりテーマ色が適用されます。
  • cspell.jsonbdaypass-throughsspinbutton などの新語が登録され、スペルチェックが正しく通過します。

ドキュメント・ナビゲーション更新

サイドバー (sidebar.njk) に Date PickerKnown DateTime Picker のリンクが追加され、known-date.mdtime-picker.md が新規作成されました。component.njk のプロパティ表示ロジックもエスケープ処理に変更され、HTML エスケープが安全に行われます。

設計判断

コンポーネントの粒度と再利用性

WaKnownDateWaTimePicker「セグメント化」 という共通パターンを抽象化し、SegmentedFieldController に集約しました。この設計により、将来的に別のピッカー(例: <wa-month-picker>)を実装する際にロジック重複を回避でき、テストコードもコントローラ単体で網羅可能です。

ロケール依存のフィールド順序

ロケール順序を 実行時に Intl.DateTimeFormat.formatToParts でプローブ する方針は、ブラウザ実装差分を吸収しつつ正確な順序を取得できる点で妥当です。キャッシュを導入し、同一ロケールでの余計なプローブを防いでパフォーマンスを確保しています。

バリデーション戦略

部分入力に対しては PartialDateValidator が UI レベルで明示的なエラーメッセージ(incompleteDate)を提供し、HTML の required と併用しても二重警告が出ないように設計されています。これにより、既知の日付入力に特化した UX が実現されています。

まとめ

今回の PR は 分割入力コンポーネントと汎用セグメントコントローラ を本体に統合し、ロケール対応・アクセシビリティ・国際化 を同時に拡充しました。新規 UI が追加されたことで、ユーザーは既知の日付や時間を正確に入力でき、開発者は共通ロジックを再利用して拡張が容易になるという二重の利点が得られます。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
3e1c21d3

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

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

リード文、背景、技術的変更、設計判断、まとめの全てが揃っており、総論→各論→結論の流れが明確です。

カスタムMarkdown構文 ⚠ WARNING

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

コードブロックのファイル名付きシンタックスハイライトは正しい形式ですが、PRリンクが "[PR #2407](URL)" となっており、要求された "[#2407](URL)" 形式と少し異なります。

対象読者への適合性 ✓ PASS

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

対象は Web Awesome の開発者向けで、専門用語や実装詳細が中心です。初心者向けの過剰な説明はありません。

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

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

各セクションが総論・各論・結論の構成になり、段落はトピックセンテンスで始まり、1段落1トピック、適切な長さで空行で区切られています。

Diff内容との照合 ✓ PASS

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

記事中のコードブロックは Diff に含まれるファイルと一致しており、抜粋でも内容は正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

使用されている技術用語は PR やコードベースと一致しており、誤用はありません。

説明の技術的正確性 ✓ PASS

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

技術的な説明は Diff と PR の情報に基づき正確で、因果関係も論理的です。

事実の突合 ✓ PASS

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

すべての主張は PR 内容、Diff、またはコードと照合でき、捏造や推測はありません。

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

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

PR 番号 #2407 は正しく記載されています。他の数値や固有名詞の誤りはありません。

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

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

記事タイトルは PR が追加したコンポーネントと翻訳・イベント拡充を的確に表現しています。

外部知識の正確性 ✓ PASS

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

記事は PR に記載されていない外部知識(LTS、EOL など)を含んでいません。

時間表現の正確性 ✓ PASS

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

時間表現の歪曲はなく、PR の情報と一致しています。