Vercel の UI SDK 0.1.0-beta.2 上に構築。API は変わる可能性があります。
Date input
Vercel の UI SDK で作る日付欄。ロケールの順に部分ごとに入力し、任意の時刻、最小値と最大値、選べない日、ISO 形式の値を備えます。
- フォームのコンポーネント
- 3 個のパーツ
- 10 個の例
@ui-sdk/core@ui-sdk/react
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-date-input.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @ui-sdk/react@0.1.0-beta.2 @ui-sdk/core@0.1.0-beta.2 cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/ui-sdk-date-input.tsx インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
UI SDK は ui-sdk というカスケードレイヤーに少しだけ独自の CSS を追加します。自分のクラスが優先されるよう、グローバルスタイルシートの先頭、Tailwind の import より上でこのレイヤーを宣言してください。
誕生日のように覚えている日付には日付欄を使います。値は "2026-11-02" のような ISO 形式の日付で、すべての部分が埋まるまでは null のままです。各部分は入力に合わせて埋まって次へ進み、日はその月の範囲に収まり、日付全体をどの部分にも貼り付けられます。カレンダーから選ぶ場合は Date Picker を使ってください。
この欄はグループなので、aria-labelledby か aria-label で名前を付けてください。枠内のどこをクリックしても、いちばん近い部分にフォーカスします。
DateInput は部分を自動で描画します。横にアイコンなどを置くときは、DateInputSegments を自分で追加してください。
granularity を "hour"、"minute"、"second" にすると時刻が加わり、値は "2026-11-02T14:30" のようなローカルの日時になります。
min より前、または max より後の日付は欄を無効にし、フォームは送信されません。
unavailable は ISO 形式の日付、{ from, to } の範囲、曜日、または関数を受け取り、該当する日付は無効になります。
locale は順序と区切り文字を決めます。数字は常に 0〜9、暦は常にグレゴリオ暦なので、値はどこでも同じ日付を表します。
隠し入力が ISO 形式の日付を name で送信します。ここでは Time Input と並べています。required は空や途中までの日付を止め、リセットすると既定値に戻ります。
createDateInputController() で、どこからでも欄の値を設定・消去したりフォーカスしたりできます。部分は "year" のように単位で指定します。
読み取り専用の欄はフォーカスでき送信もされますが、キー操作や入力では変わりません。
部分はロケールの順序を保ち、矢印キーは画面上の並びに従います。
| キー | アクション |
|---|---|
| 0–9 | 部分を埋めて、次の部分に移ります。 |
| /. | 次の部分に移動します。 |
| ↑↓ | 部分を 1 ずつ変え、端で一周します。空の部分は今日から始まります。 |
| PageUpPageDown | 大きく変えます。年は 5、月は 3、日は 7 ずつです。 |
| HomeEnd | 部分の最初または最後の値に移動します。 |
| ←→ | 前または次の部分に移動します。 |
| Backspace | 最後の数字を消し、次に部分を空にし、さらに前の部分へ戻ります。 |
| Enter | 入力した内容でフォームを送信します。 |
ルートはグループです。各部分は「month」のように単位で名前が付いた spinbutton で、値と範囲を持ち、空の部分は「Empty」と読み上げられます。部分の間の文字はスクリーンリーダーから隠れます。
各部分は実際の入力欄なので、スマートフォンでは数字キーパッドが出て、ページのスクリプトが動く前から入力できます。タッチ画面ではズームされないよう 16px に大きくなり、フォーカス中の部分はキャレットの代わりにハイライトされます。
各パーツは同名の UI SDK パーツをラップし、render やパーツの状態を受け取る関数にもできる className を含むすべての props を受け付けます。
| プロパティ | 型 | デフォルト |
|---|---|---|
value | string | null | – |
defaultValue | string | null | – |
onValueChangeすべての部分が埋まったときに呼ばれ、どれかが空になると null で呼ばれます。 | (value: string | null, details) => void | – |
granularity | "day" | "hour" | "minute" | "second" | "day" |
hourCycle既定はロケールの時計です。 | 12 | 24 | – |
min | string | – |
max | string | – |
unavailableISO 形式の日付、{ from, to } の範囲、{ weekday }、または関数です。 | DateMatchers | – |
locale既定はページの言語です。 | string | – |
invalid | boolean | false |
disabled | boolean | false |
readOnly | boolean | false |
required | boolean | false |
name | string | – |
form | string | – |
controllercreateDateInputController() で作ります。 | DateInputController | – |
children既定は DateInputSegments です。 | ReactNode | (state) => ReactNode | – |
render | ReactElement | (props, state) => ReactElement | – |
| 属性 | 説明 |
|---|---|
data-slot="date-input" | CSS で日付欄を指定するためのものです。 |
data-invalid | 日付が min と max の範囲外のとき、選べない日のとき、または invalid が設定されたときに付きます。 |
data-empty | すべての部分が空の間に付きます。 |
data-disabled | 無効のときに存在します。 |
data-readonly | 読み取り専用のときに付与されます。 |
data-required | 必須のときに付与されます。 |
各部分の DateInputSegment を、ロケールの順に間の文字とともに描画します。
| プロパティ | 型 | デフォルト |
|---|---|---|
segmentルートの状態にある segments の 1 つです。 | DateInputSegmentData | – |
render | ReactElement | (props, state) => ReactElement | – |
| 属性 | 説明 |
|---|---|
data-slot="date-input-segment" | CSS で部分を指定するためのものです。 |
data-type | year、month、day、hour、minute、second、dayPeriod、または部分の間の文字を表す literal です。 |
data-empty | 部分が空の間に付きます。 |
- Calendar単一、範囲、複数選択に対応する日付グリッドです。月のスライド、範囲のプレビュー、タッチしやすいサイズの日付セルを備えています。
- Checkboxチェックが描かれるように表示されるチェックボックスです。中間状態の親、グループ、ホバーを共有するラベルに対応します。
- Comboboxチップ、グループ、非同期の結果に対応した、絞り込み可能なセレクトです。入力に合わせてポップアップのサイズが変わります。
- Date picker押すとポップオーバーでカレンダーを開くボタンです。スマートフォンではボトムシートになり、単一の日付も範囲も選べます。
- Fieldコントロールに紐付いたラベル、説明、エラーです。バリデーション状態とフォーム向けのレイアウトを備えています。
- Input3つのサイズ、無効状態と読み取り専用状態、ネイティブのバリデーションスタイル、スマートフォンでズームされない16pxのタッチ用フォントを備えたテキスト入力です。