phantom gap を除去した `<wa-date-input>` と `<wa-time-input>` のスタイル修正

shoelace-style/webawesome

この PR は、空の start/end スロットが余計な間隔を生じさせていた <wa-date-input><wa-time-input> の左端揃えを修正し、他のフォームコントロールとビジュアルを統一します。

背景

Issue #2527 で報告されたように、<wa-date-input><wa-time-input> の選択された値が、同一レベルの <wa-select><wa-input> と比較して左側に数ピクセルずれて表示されるという phantom gap が発生していました。原因は、コンポーネント内部のスロット構造が空の場合でも CSS の gap が適用され、余分なスペースが挿入されていたことです。この視覚的不整合は、フォーム全体の一貫性を損なうため修正が求められました。

したがって、スタイルレベルで余計な間隔を削除し、スロットが空でも他のコントロールと同一の開始位置になるように調整する方針が採られました。

技術的な変更

修正は packages/webawesome/src/components/time-input/time-input.styles.ts の CSS を直接変更することで実現されています。具体的には、コンテナ要素から gap: 0.25em; を除去し、代わりにクリアボタンと拡張ボタンに margin-inline-start: 0.25em; を付与して、空スロットが余計なスペースを生成しないようにしています。この変更により、ボタンと入力値の間の視覚的な間隔は維持されつつ、不要な phantom gap が排除されます。

@@ -150,7 +150,6 @@ export default css`
     width: 100%;
     min-width: 0;
     align-items: center;
-    gap: 0.25em;
     min-height: var(--wa-form-control-height);
     background-color: var(--wa-form-control-background-color);
     border-color: var(--wa-form-control-border-color);
@@ -283,6 +282,8 @@ export default css`
     cursor: pointer;
     color: var(--wa-color-text-quiet);
     font: inherit;
+    /* Margin separates the button from the value so empty start/end slots don't add a phantom gap. */
+    margin-inline-start: 0.25em;
     padding: 0.25em;
     border-radius: var(--wa-border-radius-s);
     transition: color var(--wa-transition-fast);

CSS のみの調整であるため、コンポーネントの JavaScript ロジックや公開 API には影響がなく、既存の利用者はそのまま動作を継続できます。

設計判断

本修正では、スロット構造を変更せずに CSS のプロパティでレイアウトを調整する方針が選択されました。gap プロパティは子要素全体に均等な間隔を与える便利な手段ですが、空スロットが存在するケースでは意図しない余白を生むことが判明したため、対象要素に限定した margin-inline-start に置き換えることで最小限の侵入性に抑えています。このアプローチは、デザインの一貫性を保ちつつ、将来的に同様のスロットベースレイアウトで生じうる余計な間隔への対策パターンとして再利用可能です。

結果として、コンポーネントの外観が他のフォームコントロールと揃い、ユーザー体験の統一感が向上しました。

まとめ

空の start/end スロットが引き起こす phantom gap を CSS の gap 削除と margin-inline-start 追加で解消し、<wa-date-input><wa-time-input> が他のフォームコントロールと同一の左端揃えになるように調整しました。この変更は視覚的な一貫性を高めると同時に、コンポーネントの API を維持したまま実装できた点が評価されます。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
688d9042

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

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

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

カスタムMarkdown構文 ⚠ WARNING

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

GitHubリンクは正しくリンク化されていますが、PRリンクのテキストが「PR #2529」の形であり、推奨の「[#2529](URL)」形式と完全には一致していません。また、Issue #2527 がプレーンテキストでリンク化されていません。ファイル名付きシンタックスハイライトは使用していないため問題はありません。

対象読者への適合性 ✓ PASS

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

対象はウェブコンポーネント開発者などのエンジニアで、専門的な用語と実装詳細が中心。初心者向け過剰な説明はありません。

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

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

各セクションは総論パラグラフ→各論パラグラフ→結論パラグラフの構成で、段落は1文でトピックセンテンスが開始され、6文以内でまとめられ、空行で区切られています。

Diff内容との照合 ✓ PASS

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

記事内の diff ブロックは提供された Diff と完全に一致し、ファイル名・行番号・変更内容すべて正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「phantom gap」「gap」「margin-inline-start」などの用語は PR と一致し、誤用はありません。

説明の技術的正確性 ✓ PASS

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

技術的な説明は Diff の変更点と整合し、意図した効果(余分な間隔の除去)を正しく伝えています。

事実の突合 ✓ PASS

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

記事の全ての主張は PR のタイトル、説明、Diff に裏付けられており、根拠のない推測や数値の主張はありません。

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

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

PR 番号 #2529 と Issue 番号 #2527 が正しく記載されています。その他数値的な記述はありません。

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

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

記事タイトルは PR の内容 "Fix phantom gap in date and time inputs" を日本語で正確に要約しています。

外部知識の正確性 ✓ PASS

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

記事は PR に記載された情報以外のバージョンサポートやリリーススケジュール等の外部知識を含んでいません。

時間表現の正確性 ✓ PASS

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

時間表現は使用しておらず、PR の表現と食い違いもありません。