DatePicker

日付や期間を、一つの入力欄で選びます。

公開日

日付をひとつ選択します。

集計期間

開始日・終了日の両方を指定します。

予定日

1日だけの予定にも、数日にわたる予定にも使えます。

開始日・終了日を別々に指定

開始日は必須、終了日は任意です。互いの日付を上限・下限として連動します。

開始日
終了日
項目名を問わず前後を連動

原稿締切は公開日の前日まで。公開日は原稿締切の翌日以降です。

原稿締切
公開予定日
未入力・同日・境界・利用不可
未入力の日付
未入力の期間
同日の期間
9月の期間
利用不可の日付
読み取り専用の日付

使いどころ

  • 日付を一つ、または開始日と終了日の期間を、一つの欄とカレンダーで選ぶ時に使います。
  • 一日で終わることも数日にわたることもある項目(予定の日付など)は mode="flexible" にして、単日か期間かを利用者が決められるようにします。
  • 開始日と終了日が別々の項目で、片方または両方が任意の時は、range ではなく single を二つ置き、minFrom・maxFrom で前後をつなぎます。
  • 時刻も一緒に決める時は DateTimeRange、月や週の予定を見渡して日付を探す時は Calendar を使います。

使い方

mode で形を選び、送る名前と初めの値を渡します。single は name と value、range は startName・endName と start・end、flexible は startName・endName・kindName と初めの selection です。欄には単日を YYYY/MM/DD、期間を YYYY/MM/DD – YYYY/MM/DD で表示します。

欄の端のボタンでカレンダーを開きます。カレンダーで選んだ日付はその場で送信フィールドへ反映し、閉じても保持します。range では開いて最初に選んだ日が開始日、その後に選んだ日が終了日になり、開始日より前の日を選ぶと開始日も動きます。上部の終了日の欄にフォーカスすると、終了日から選び直せます。flexible は下部の「終了日」スイッチで期間に切り替えます。開始日がある時にShift+クリックすると、その日までの期間になります。「クリア」は選択を空にして閉じます。

カレンダーは白いパネル(1px #bbb の枠、角丸5px、外への柔らかい影)です。上に月の名前(黒の通常の太さ)と、枠も塗りも持たない黒い矢印の月送りのボタンを置きます。その月の日は角の無い淡い青(#e3ebf8)の高さ24pxのセルに濃い紺の数字で、列の間は空けず、行の間だけを白い2pxで区切ります。前後の月の日は塗らずに灰色の文字にします。今日は黄色(#ffe582)の面、選んだ日(期間の開始日と終了日)はチェックボックスの選んだ状態と同じ淡い青の縦の塗りに紺の縁と紺の太字、期間の途中の日はメニューの選んでいる項目と同じ淡い青(#ddeefe)の面です。選べない日はセルの面をそのままにし、数字だけを灰色にします。「クリア」はカレンダーの下の中央に置いた、下線付きの青緑のリンクです。

日付は直接入力もできます。欄には YYYY/MM/DD(YYYY-MM-DD も可)、期間は二つの日付を「–」で区切って入力します(「~」「〜」「 - 」も受け付けます)。カレンダー上部の欄では 2026/9/1 のようなゼロ埋めしない日付も受け付けます。入力途中の不正な文字列は送信値に反映せず、欄の下に直し方を出します。

送信する値:日付は指定した名前へ YYYY-MM-DD で送り、表示用の文字列は送りません。single は name の一つ、range は startName・endName の二つを送ります。flexible はそれに加えて kindName へ single か range を送り、同じ日の期間も range のまま保ちます。未入力の日付と、flexible の単日の終了日は空文字を送ります。空の扱いはサーバー側で決めます。date[start] のような角括弧を含む名前もそのまま送り、入れ子への変換はサーバー側で行います。

required は未入力を誤りにし、range では開始日と終了日の両方を求めます。存在しない日付、範囲外の日付、開始日より前の終了日も誤りです。誤りは欄の下に理由を出し、直すまでフォームの送信を止めます。readonly は値を表示したまま送り、カレンダーは開きません。disabled は欄全体を使えなくし、値を送りません。

日付同士の上限・下限:min・max は固定の範囲です。minFrom は参照する日の当日以降、maxFrom は当日以前を許可します。参照先はDatePickerのルートID、または YYYY-MM-DD を値に持つ通常の input のIDで、ラベル・name・必須かどうかから関係を推測しません。{ id, offsetDays } で日数の差を付け(1 で翌日以降、-1 で前日以前)、期間の終了日を参照する時は bound: "end" にします。固定の min・max と併せると、両方を満たす日だけを許可します。

例えば受付日に maxFrom="response"、対応予定日に minFrom="received" を渡すと、受付日は対応予定日以前、対応予定日は受付日以降に限られます。原稿締切に maxFrom={{ id: "release", offsetDays: -1 }}、公開予定日に minFrom={{ id: "manuscript", offsetDays: 1 }} を渡すと、締切は公開日の前日まで、公開日は締切の翌日以降になります。

連動は参照先の変更・refresh()・フォームのリセットに追従し、相手の値は書き換えません。参照先が空・不正・ページに無い時は、その条件を外します。上限が下限より前になると選べる日が無くなり、欄の下にその旨を出します。条件から外れた既存の値は残したまま誤りを出し、直すまで送信を止めます。前後関係は保存先でも検証します。

変更のイベント:値を確定する前に取り消せる date-picker:beforechange を、確定した後に date-picker:change を発火します。送信フィールドにも標準の input・change を発火するので、フォームの変更の検知はそのまま使えます。外から送信フィールドの値を変えた時は、そのフィールドに input・change を発火するか、controllerの refresh() を呼んで表示を合わせます。フォームのリセットでは初めの値に戻します。

JavaScriptが無い時やPopover APIを使えないブラウザでは、標準の日付入力(type="date")を表示します。range と flexible は開始日・終了日の二つの欄を置き、flexible には「日付の形式」の選択を加えます。送る名前と値の形は同じです。minFrom・maxFrom は連動しないので、サーバー側でも検証します。

キーボード

DatePickerのキーボード操作
キー動作
Enter・Space(開くボタン)カレンダーを開き、上部の日付の欄へ移ります。指で操作する画面(pointer: coarse)では、選んでいる日付へ移ります。
Enter(上部の欄)入力した日付を確定し、誤りが無ければ閉じます。
↓(上部の欄)日付のグリッドへ移ります。
←・→前後の日へ移ります。右から左に読む時は逆です。月をまたぐと表示の月も移ります。
↑・↓前後の週の同じ曜日へ移ります。
Home・Endその週の月曜・日曜へ移ります。
PageUp・PageDown前後の月の同じ日へ移ります。
Shift+PageUp・PageDown前後の年の同じ日へ移ります。
Enter・Space(日付)その日を選びます。
Shift+Enter・Shift+Space(日付)flexible で開始日がある時、その日までの期間にします。
Escカレンダーを閉じ、開くボタンへ戻ります。

アクセシビリティ

  • label は欄の legend になり、表示の欄・開くボタン(「〜のカレンダーを開く」)・カレンダー(role="dialog"、「〜を選択」)の名前にも使います。開くボタンは aria-haspopup="dialog" と aria-expanded を持ちます。
  • 日付のグリッドは role="grid" で、表示中の年月を名前にし、月を移ると年月を読み上げます。各日は「2026年9月12日」の形の名前を持ち、選んだ日に aria-pressed="true"、今日に aria-current="date" を付けます。Tabでグリッドへ入る日は一つだけです。
  • 選んでいる状態(「開始日を選んでください。」など)と上部の欄の誤りは role="status" で伝えます。
  • 欄の誤りは表示の欄と送信フィールドに aria-invalid を付け、aria-describedby に誤りの文を加えます。help も同じく関連付けます。
  • フォーカスがカレンダーの外へ出ると閉じます。

イベント

DatePickerが発火するイベント
イベント内容
date-picker:beforechange値を確定する前に発火します。取り消せます(取り消すと表示を元に戻します)。detailは { selection, previousSelection } で、どちらも { kind, start, end? } の形です。
date-picker:change値を確定した後に発火します。detailは date-picker:beforechange と同じです。
date-picker:sync表示を送信フィールドの値に合わせ直した時に発火します。detailはありません。minFrom・maxFrom の連動はこのイベントを受けて追従します。

API

DatePicker

DatePickerのprops
名前型既定値説明
label必須string欄の名前。legendに出し、カレンダーを開くボタンとカレンダーの読み上げ名にも使う。
minstring選べる最も早い日(YYYY-MM-DD)。minFromと併用すると、遅い方が下限になる。
maxstring選べる最も遅い日(YYYY-MM-DD)。maxFromと併用すると、早い方が上限になる。
minFromstring | DatePickerBoundReference下限を別の日付から取る。DatePickerのルートID、またはYYYY-MM-DDを値に持つinputのIDを渡す。参照先の日(offsetDaysを足した日)以降を許可する。参照先が空・不正・未配置なら、この条件を外す。
maxFromstring | DatePickerBoundReference上限を別の日付から取る。DatePickerのルートID、またはYYYY-MM-DDを値に持つinputのIDを渡す。参照先の日(offsetDaysを足した日)以前を許可する。参照先が空・不正・未配置なら、この条件を外す。
requiredboolean未入力をエラーにする。rangeでは開始日・終了日の両方を求める。
readonlyboolean値を見せたまま編集を止める。カレンダーは開かず、値は送信する。
helpstring欄の下に出す補足。入力欄のaria-describedbyに関連付ける。
mode形による"single" | "range" | "flexible""single"singleは単日、rangeは期間、flexibleは単日と期間を利用者が切り替える。
name形によるstring日付をYYYY-MM-DDで送るフィールドの名前。
valuestring初期の日付(YYYY-MM-DD)。
startName形によるstring開始日をYYYY-MM-DDで送るフィールドの名前。flexibleでも同じ。
endName形によるstring終了日をYYYY-MM-DDで送るフィールドの名前。flexibleの単日では空文字を送る。
startstring初期の開始日(YYYY-MM-DD)。
endstring初期の終了日(YYYY-MM-DD)。
kindName形によるstring選んだ形(singleまたはrange)を送るフィールドの名前。
selection形によるDatePickerSelection初期の形と日付。同日の期間もrangeのまま保つ。

ほかに、<fieldset>へ標準のHTML属性を渡せます。

登録するcontroller:date-picker(DatePickerController)

読み込むCSS:layers.css、reset.css、tokens.css、base.css、layout.css、components/button.css、components/overlay.css、components/field.css、components/icon.css、components/switch.css、components/date-picker.css

DatePickerBoundReference

idはDatePickerのルート、または通常の日付inputを参照する。

DatePickerBoundReference
名前型既定値説明
id必須string参照するDatePickerのルートID、またはYYYY-MM-DDを値に持つinputのID。
bound"start" | "end"参照先が期間の時に、開始日と終了日のどちらを使うか。通常のinputでは使わない。
offsetDaysnumber参照先の日に足す日数。1で翌日から、-1で前日まで、のように差を付ける。

DatePickerSelection

単日と同日の期間も、呼び出し側が指定した種別のまま扱う。

DatePickerSelection(kind: "single")
名前型既定値説明
kind必須"single"単日。
start必須string日付(YYYY-MM-DD)。未入力は空文字。
DatePickerSelection(kind: "range")
名前型既定値説明
kind必須"range"期間。開始日と終了日が同じ日でも期間として扱う。
start必須string開始日(YYYY-MM-DD)。未入力は空文字。
end必須string終了日(YYYY-MM-DD)。未入力は空文字。

コード

HTML
Hono JSX