Input
3つのサイズ、無効状態と読み取り専用状態、ネイティブのバリデーションスタイル、スマートフォンでズームされない16pxのタッチ用フォントを備えたテキスト入力です。
pnpm dlx shadcn@latest add https://hextaui.com/r/input.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @base-ui/react class-variance-authority cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/input.tsx components/ui/number-flow.tsx lib/motion.ts インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
サイズ
sm、default、lg はボタンの高さに合っているため、同じサイズの入力欄とボタンが 1 行に揃います。
説明付き
aria-describedby を補足テキストに向けると、スクリーンリーダーがラベルの後にそれを読み上げます。
無効な値
aria-invalid は、縁とフォーカスリングを赤くします。メッセージは色が付くだけでなく通知されるよう、aria-describedby で関連付けます。
ネイティブの検証
required、type="email"、pattern を持つフィールドは、誰かが入力した後、または送信を試みた後にのみ赤くなり、最初のレンダリング時には赤くなりません。送信時にフィールドが無効と判定されると、そのフィールドが 1 回揺れて、修正が必要な箇所に目が向きます。入力中やタブで移動している間は揺れません。空のフォームを送信すると確認できます。
無効
無効な入力欄には、フォーカス、編集、フォームでの送信ができません。
読み取り専用
readOnly は、値をフォーカス可能、選択可能、送信可能なままにし、編集できるように見えないよう控えめな面で表示します。コピーしたい値には、disabled よりこちらをお勧めします。
ファイル
type="file" にも同じ枠が付き、ブラウザのボタンはプレーンなテキストとしてスタイルされます。
入力の種類
パスワード、数値、検索、日付、時刻は、同じ高さと枠を共有します。ダークモードでは、ブラウザのピッカーやスピナーもダークに切り替わります。
制御
onValueChange は文字列を直接渡すため、event.target.value を取り出す必要がありません。onChange も引き続き使えます。
ボタンと組み合わせる
余白を空けて横に並べるか、<ButtonGroup /> の内側で 1 つのコントロールに連結します。後者では、入力欄が残りの幅を占めます。
グリッド
入力欄はコンテナいっぱいに広がるため、グリッド内に配置します。長い値で列が広がらないよう、グリッドのセルに min-w-0 を付けてください。
長いコンテンツ
長い値はフィールド内でスクロールし、長いプレースホルダーは切り詰められ、レイアウトが広がることはありません。
右から左
テキスト、キャレット、パディングは方向に従います。アラビア語のフォームにあるメールアドレスのように、左から右の値を保持するフィールドには dir="auto" を使います。
- すべての入力欄には名前が必要です。
htmlForを持つ<label>を使うか、表示されるラベルがない場合はaria-labelを使ってください。プレースホルダーはラベルではありません。 - 補足テキストとエラーテキストは
aria-describedbyで関連付け、aria-invalidは、表示するエラーがあるときにだけ設定してください。 - タッチスクリーンではテキストが 16px 以上になるため、入力欄にフォーカスしても iOS Safari がページをズームすることはありません。
- Base UI の
Fieldの内側では、ラベル、説明、エラー、有効性が自動で結び付けられます。
Base UI の input をベースにしています。ネイティブの input のすべての属性を受け付けます。
| プロパティ | 型 | デフォルト |
|---|---|---|
sizeボタンに合わせた、高さとパディング。 | "sm" | "default" | "lg" | "default" |
htmlSizeネイティブの size 属性。size は variant に使われているため、名前を変えています。 | number | – |
value | string | number | string[] | – |
defaultValue | string | number | string[] | – |
onValueChange変更のたびに、新しい値とともに呼ばれます。 | (value: string, details) => void | – |
type | string | "text" |
disabled | boolean | false |
readOnly | boolean | false |
aria-invalid不正の縁とフォーカスリングを表示します。 | boolean | – |
className | string | (state) => string | – |
shakeフォームの送信時にこの入力欄が無効と判定されると、1 回揺れます。ネイティブの検証、Base UI の Field、aria-invalid を設定するライブラリで動作します。モーションの低減が有効な場合はスキップされます。 | boolean | true |
render | ReactElement | (props, state) => ReactElement | <input> |
| 属性 | 説明 |
|---|---|
data-slot="input" | CSS で入力欄を指定します。 |
data-size | 現在のサイズ。 |
data-shake | 送信に失敗した後、入力欄が揺れている間、付与されます。 |
data-disabled | 入力欄が無効なときに付与されます。 |
data-invalid | 周囲の Field が不正なときに付与されます。aria-invalid と同じようにスタイルされます。 |
data-valid | 周囲の Field が有効なときに付与されます。 |
data-touched | Field 内で、入力欄が一度フォーカスを失った後に付与されます。 |
data-dirty | Field 内で、値が変更された後に付与されます。 |
data-filled | Field 内で、入力欄に値があるときに付与されます。 |
data-focused | Field 内で、フォーカスされている間、付与されます。 |
入力欄の背後にあるクラス名。ネイティブの <select> や <textarea> など、他の要素のスタイルを合わせるために使います。{ size } を渡して呼び出します。
<InputGroupCount /> と <FieldCounter /> の背後にある文字数カウント。フィールドを自動で読み取ってくれるそれらのパーツを使ってください。自分で長さを追跡する場合にのみ、これを使います。
| プロパティ | 型 | デフォルト |
|---|---|---|
length必須。 | number | – |
maxLength | number | null | – |
threshold | number | 10% of maxLength, at most 20 |
announcement | (remaining: number) => string | – |
| 属性 | 説明 |
|---|---|
data-slot="input-count" | CSSでカウントを指定します。 |
data-state="near" | "limit" | しきい値内、および上限に達したときに付与されます。 |
- Motionすべてのコンポーネントがアニメーションに使うイージングカーブ、継続時間、モーション軽減のチェックと、サイズのモーフィングやスライドするハイライト用のフックです。
- Number flow変化した桁だけが回転するアニメーション付きの数値です。任意のIntlフォーマットとロケールに対応します。
- useAutosizeテキストエリアを、書いた内容に合わせて最小の高さと最大の高さの間で伸ばします。変化ごとにアニメーションしますが、テキストには一切触れません。
- useComposedRef自分の要素へのrefを保持しつつ、親から渡されたrefにもそのまま転送します。
- useInvalidShake送信を試みて無効だったとき、フォームコントロールを揺らします。入力中は揺らしません。
- useMergedRef任意の数のコールバックrefとオブジェクトrefを1つにまとめます。それぞれにReact 19のrefクリーンアップが適用されます。
使用しているブロック
Input の上に構築されるブロック。
- API keysOpenAIやAnthropicのコンソールのような、AIプロダクトのAPIキーのページです。スコープ付きの権限と有効期限を持つキーを作成し、シークレットは一度だけ表示され、コピーで確認でき、取り消しは元に戻せ、その場で名前を変更でき、猶予期間つきでローテーションでき、キーごとの使用量を確認できます。
- BillingCursor、Claude、Vercelのスタイルによる、AIプロダクト向けのプランと使用量です。モデルごとに分かれ、サイクル終了時を予測してクレジット切れの前に警告する使用量メーター、ドラッグで確認できる日別チャート、メーター上でプレビューできるアラートつきの支出上限、正確な日割り計算によるプラン変更、実際のバリデーションを備えたカードフォーム、PDFでダウンロードできる請求書を備えています。
- ModelsAIプロダクトの設定にあるモデルページです。コンテキスト、速度、コストが一目でわかるデフォルトモデル、各モデルが対応する内容を把握しているデフォルトの推論量、フィルター、ピン留め、一括切り替えを備えプロバイダーごとにグループ化された検索可能なモデルリスト、実際の接続テストができるOpenAI互換サーバー、新着を知らせる更新を備えています。
- NotificationsAIプロダクトの設定にある通知セクションです。行、列、すべてを切り替えられるチャンネルとイベントのグリッド、次の静音時間をリアルタイムで示す静音時間、メールダイジェスト、デスクトップ、メール、プッシュ、Slackの実際のテスト送信、ブラウザー権限の処理、Slackの接続フローを備えています。どの設定セクションにも組み込めます。