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