Field
コントロールに紐付いたラベル、説明、エラーです。バリデーション状態とフォーム向けのレイアウトを備えています。
pnpm dlx shadcn@latest add https://hextaui.com/r/field.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/field.tsx components/ui/input.tsx components/ui/number-flow.tsx components/ui/separator.tsx lib/motion.ts インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
HextaUI の任意のコントロールを <Field /> の内側に置くと、ラベル付け、説明付け、検証が自動的に行われます。id、htmlFor、aria-describedby を手動で結び付ける必要はありません。
ラベル、ヘルプテキスト、検証を備えた 1 つのコントロール。
テキストを横に添えたスイッチまたはチェックボックス。
フィールド全体を包むラベル。カードがクリック対象になります。
均等に間隔を空けた、関連するフィールド。
タイトル付きのフィールドグループ、または選択肢ごとに項目を持つラジオ・チェックボックスのグループ。
Input
ラベル、コントロール、説明。ラベルをクリックすると入力欄にフォーカスし、スクリーンリーダーはラベルの後に説明を読み上げます。
検証
required や minLength などのネイティブな制約は、blur 時に検査されます。問題ごとにメッセージの文言を変えるには、各 <FieldError /> に match を指定します。空の必須フィールドは、編集された後にのみ指摘されるため、タブで通り過ぎただけでは警告されません。
カスタムの検証
非同期の照会を含め、任意の検証を行うには validate を渡します。失敗にはメッセージを返し、成功にはなにも返しません。validationMode="onChange" と validationDebounceTime を組み合わせると、すべてのキー入力で発火せずに、入力中に実行されます。「ada」を試してみてください。
必須と任意
FieldGroup、FieldSet、Field に indicator を設定すると、内側のすべてのラベルが、コントロールの required 属性に基づいて自分でマークを付けます。"optional" は省略できるフィールドにタグを付けるため、ほとんどのフィールドが必須の場合は、より穏やかに見えます。"required" はアスタリスクを追加します。コントロールがすでに必須であることを通知するため、マークはスクリーンリーダーからは隠されます。
ステータス
<FieldStatus /> は、編集されたフィールドが検証に通るとチェックマークを描画し、失敗している間はアラートアイコンを表示します。フィールドの validationMode に従うため、検証が実行される前にフィールドを判定することはありません。
文字数
<FieldCounter /> はフィールド内のテキストコントロールを見つけ、その maxLength に対する文字数を数えます。監視するだけなので、入力が遅くなったり変更されたりすることはありません。
フォームライブラリやサーバーからのエラー
フィールドに invalid を、<FieldError /> に errors 配列を渡します。React Hook Form や多くのスキーマライブラリが返す { message } の形を受け付けます。重複は取り除かれ、複数のメッセージはリストになります。メッセージが変わると、新しいものがフェードインし、高さが内容に合わせてイージングするため、下のコンテンツが跳ねることはありません。空のまま送信し、ルールを 1 つずつ修正してみてください。
チェックボックス
チェックボックスをラベルの隣に置くには、orientation="horizontal" を使います。<FieldSet /> の内側では、legend がグループ全体の名前になります。
選択カード
フィールド全体を <FieldLabel /> で囲むと、カードがクリック対象になります。ラベルはネストできないため、内側では <FieldTitle /> を使います。カードはチェックされると色が付き、チェックボックスにフォーカスがあるとフォーカスリングが表示されます。
Fieldset
<FieldSet /> は関連するフィールドを <FieldLegend /> の下にまとめ、それがグループのアクセシブルな名前になります。フィールドを横に並べるには、プレーンなグリッドを使います。
レスポンシブ
orientation="responsive" は、狭い空間ではラベルとコントロールを縦に積み、周囲の <FieldGroup /> が十分に広くなると横に並べます。ウィンドウの幅ではなく、グループの幅に応じます。
無効
<FieldSet /> を無効にすると、内側のすべてのフィールドとコントロールが無効になります。1 つだけを無効にするには、その <Field /> に disabled を渡します。
長いコンテンツ
ラベル、説明、エラーは、区切りのない文字列も含めて、狭いフォーム内で折り返され、レイアウトを広げることはありません。
右から左
テキスト、チェックボックスの配置、エラーのリストは、読む方向に従います。
- ラベル、説明、表示されているエラーは自動でコントロールに関連付けられるため、フォーカスすると、スクリーンリーダーが 3 つすべてを読み上げます。
- 無効なコントロールには
aria-invalidが付き、エラーのリングも描画されます。 - エラーはライブリージョンではありません。コントロールにフォーカスしたときに読み上げられるため、変更時に検証しても入力は中断されません。送信時には、最初の無効なフィールドにフォーカスを移動します。
- エラーは、コンテンツを押し下げずに、その場で広がってフェードインします。モーションの低減が有効な場合は、アニメーションなしで表示されます。
Base UI の field と fieldset をベースにしています。各パーツは、レンダリングする要素やプリミティブの props を受け付けます。
| プロパティ | 型 | デフォルト |
|---|---|---|
orientation | "vertical" | "horizontal" | "responsive" | "vertical" |
indicatorコントロールの required 属性に基づいてラベルにマークを付けます。FieldGroup または FieldSet から継承されます。 | "required" | "optional" | null | – |
nameフォームが送信されたときに、フィールドを識別します。 | string | – |
validate失敗には 1 つ以上のメッセージを返し、成功にはなにも返しません。非同期にも対応しています。 | (value, formValues) => string | string[] | null | Promise<…> | – |
validationMode | "onSubmit" | "onBlur" | "onChange" | "onSubmit" |
validationDebounceTimeonChange の検証の間隔として待機するミリ秒。 | number | 0 |
invalidフォームライブラリやサーバーのレスポンスから設定します。 | boolean | – |
disabled | boolean | false |
dirty | boolean | – |
touched | boolean | – |
actionsRefフィールドをコードから検証します。 | RefObject<{ validate: () => void }> | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="field" | CSS でフィールドを指定します。 |
data-orientation | 現在の向き。 |
data-disabled | フィールドが無効なときに付与されます。 |
data-valid | フィールドが有効なときに付与されます。 |
data-invalid | フィールドが不正なときに付与されます。 |
data-dirty | 値が初期値から変更された後に付与されます。 |
data-touched | コントロールがフォーカスされて離れた後に付与されます。 |
data-filled | コントロールに値があるときに付与されます。 |
data-focused | コントロールにフォーカスがある間、付与されます。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
nativeLabelrender がラベルをラベル以外の要素に置き換える場合は、false に設定します。 | boolean | true |
optionalTextindicator="optional" とともに表示されるテキスト。 | ReactNode | "Optional" |
render | ReactElement | (props, state) => ReactElement | <label> |
| 属性 | 説明 |
|---|---|
data-slot="field-label" | CSS でラベルを指定します。フィールドの外側ではプレーンなラベルをレンダリングし、選択カードはこれで動作します。 |
data-disabled | フィールドが無効なときに付与されます。 |
data-valid | フィールドが有効なときに付与されます。 |
data-invalid | フィールドが不正なときに付与されます。 |
data-dirty | 値が初期値から変更された後に付与されます。 |
data-touched | コントロールがフォーカスされて離れた後に付与されます。 |
data-filled | コントロールに値があるときに付与されます。 |
data-focused | コントロールにフォーカスがある間、付与されます。 |
フィールドの有効性を反映するアイコン。意味はエラーメッセージが伝えるため、装飾です。
| 属性 | 説明 |
|---|---|
data-slot="field-status" | CSS でステータスアイコンを指定します。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
threshold | number | 10% of maxLength, at most 20 |
announcement文字数がしきい値を超えたとき、または上限に達したときの、スクリーンリーダー向けのメッセージ。 | (remaining: number) => string | – |
| 属性 | 説明 |
|---|---|
data-slot="field-counter" | CSS でカウンターを指定します。 |
data-state="near" | "limit" | しきい値内、および上限に達したときに付与されます。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <p> |
| 属性 | 説明 |
|---|---|
data-slot="field-description" | CSS で説明を指定します。 |
data-disabled | フィールドが無効なときに付与されます。 |
data-valid | フィールドが有効なときに付与されます。 |
data-invalid | フィールドが不正なときに付与されます。 |
data-dirty | 値が初期値から変更された後に付与されます。 |
data-touched | コントロールがフォーカスされて離れた後に付与されます。 |
data-filled | コントロールに値があるときに付与されます。 |
data-focused | コントロールにフォーカスがある間、付与されます。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
matchこの有効性の問題の場合にのみ表示します。true なら常に表示します。 | boolean | "valueMissing" | "typeMismatch" | "tooShort" | "tooLong" | "patternMismatch" | "rangeOverflow" | "rangeUnderflow" | "stepMismatch" | "badInput" | "customError" | "valid" | – |
errorsフォームライブラリやサーバーからのエラー。リストにメッセージがあるときに表示されます。 | Array<{ message?: string } | undefined> | – |
childrenデフォルトは、検証メッセージです。 | ReactNode | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="field-error" | CSS でエラーを指定します。 |
data-starting-style | エラーが広がって現れる間、付与されます。 |
data-ending-style | エラーが折りたたまれる間、付与されます。 |
data-disabled | フィールドが無効なときに付与されます。 |
data-valid | フィールドが有効なときに付与されます。 |
data-invalid | フィールドが不正なときに付与されます。 |
data-dirty | 値が初期値から変更された後に付与されます。 |
data-touched | コントロールがフォーカスされて離れた後に付与されます。 |
data-filled | コントロールに値があるときに付与されます。 |
data-focused | コントロールにフォーカスがある間、付与されます。 |
横並びのフィールドで、コントロールの隣にラベル、説明、エラーを縦に積みます。
| プロパティ | 型 | デフォルト |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
選択カードのように、<FieldLabel /> 内のコンテンツ用の、ラベル風スタイルのタイトル。
| プロパティ | 型 | デフォルト |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
フィールド間に間隔を空け、レスポンシブなフィールドが計測するコンテナになります。
| プロパティ | 型 | デフォルト |
|---|---|---|
indicator内側のすべてのフィールドに適用されます。 | "required" | "optional" | null | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| プロパティ | 型 | デフォルト |
|---|---|---|
indicator内側のすべてのフィールドに適用されます。 | "required" | "optional" | null | – |
disabled内側のすべてのフィールドを無効にします。 | boolean | false |
render | ReactElement | (props, state) => ReactElement | <fieldset> |
| 属性 | 説明 |
|---|---|
data-slot="field-set" | CSS で fieldset を指定します。 |
data-disabled | fieldset が無効なときに付与されます。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
variantlabel は、フィールドラベルのサイズに合わせます。 | "legend" | "label" | "legend" |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="field-legend" | CSS で legend を指定します。 |
data-variant | 現在のバリアント。 |
フォーム向けに間隔を調整した <Separator />。そのすべての props を受け付けます。
| プロパティ | 型 | デフォルト |
|---|---|---|
children行の中央に表示される任意のテキスト。 | ReactNode | – |
align行に沿ったテキストの位置。 | "start" | "center" | "end" | "center" |
decorative見た目だけのプレーンな線は、スクリーンリーダーから隠します。 | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="field-separator" | CSS でフィールドのセパレーターを指定します。 |
data-content | セパレーターにテキストがあるときに付与されます。 |
data-slot="separator-label" | テキストを包む要素。 |
グループ内の 1 つのチェックボックスまたはラジオとそのラベルを包み、各項目を個別に無効にできるようにします。
| プロパティ | 型 | デフォルト |
|---|---|---|
disabled | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
強度メーターや文字数カウンターなど、フィールドの有効性の状態に基づいて任意のものをレンダリングします。
| プロパティ | 型 | デフォルト |
|---|---|---|
children | (state: { validity, errors, error, value }) => ReactNode | – |
- Input3つのサイズ、無効状態と読み取り専用状態、ネイティブのバリデーションスタイル、スマートフォンでズームされない16pxのタッチ用フォントを備えたテキスト入力です。
- Motionすべてのコンポーネントがアニメーションに使うイージングカーブ、継続時間、モーション軽減のチェックと、サイズのモーフィングやスライドするハイライト用のフックです。
- Separatorコンテンツを水平または垂直に区切る細線です。ラベルを付けたり、見た目だけの線として装飾モードにしたりできます。
- useComposedRef自分の要素へのrefを保持しつつ、親から渡されたrefにもそのまま転送します。
- useMergedRef任意の数のコールバックrefとオブジェクトrefを1つにまとめます。それぞれにReact 19のrefクリーンアップが適用されます。
- Calendar単一、範囲、複数選択に対応する日付グリッドです。月のスライド、範囲のプレビュー、タッチしやすいサイズの日付セルを備えています。
使用しているブロック
Field の上に構築されるブロック。
- API keysOpenAIやAnthropicのコンソールのような、AIプロダクトのAPIキーのページです。スコープ付きの権限と有効期限を持つキーを作成し、シークレットは一度だけ表示され、コピーで確認でき、取り消しは元に戻せ、その場で名前を変更でき、猶予期間つきでローテーションでき、キーごとの使用量を確認できます。
- BillingCursor、Claude、Vercelのスタイルによる、AIプロダクト向けのプランと使用量です。モデルごとに分かれ、サイクル終了時を予測してクレジット切れの前に警告する使用量メーター、ドラッグで確認できる日別チャート、メーター上でプレビューできるアラートつきの支出上限、正確な日割り計算によるプラン変更、実際のバリデーションを備えたカードフォーム、PDFでダウンロードできる請求書を備えています。
- ModelsAIプロダクトの設定にあるモデルページです。コンテキスト、速度、コストが一目でわかるデフォルトモデル、各モデルが対応する内容を把握しているデフォルトの推論量、フィルター、ピン留め、一括切り替えを備えプロバイダーごとにグループ化された検索可能なモデルリスト、実際の接続テストができるOpenAI互換サーバー、新着を知らせる更新を備えています。
- NotificationsAIプロダクトの設定にある通知セクションです。行、列、すべてを切り替えられるチャンネルとイベントのグリッド、次の静音時間をリアルタイムで示す静音時間、メールダイジェスト、デスクトップ、メール、プッシュ、Slackの実際のテスト送信、ブラウザー権限の処理、Slackの接続フローを備えています。どの設定セクションにも組み込めます。