Button
すべてのバリアントとサイズのボタンです。読み込み、成功、エラーのフローを内蔵し、高速なリクエストではスピナーを省略します。
pnpm dlx shadcn@latest add https://hextaui.com/r/button.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/button.tsx インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
feedback を指定して onClick から Promise を返すと、ボタンは読み込み中、続いて成功またはエラーを表示し、その後ひとりでにリセットされます。
バリアント
7 つの variant。destructive は淡い色付けで、危険なアクションを主張しすぎずに明確に伝えます。ghost-destructive は、Sign out や Remove のように行ごとに繰り返されるアクション向けの控えめなバージョンです。
サイズ
テキストサイズは xs から lg まで、正方形の icon-* サイズもあります。小さいアイコンボタンは、タッチスクリーンでは見えないタッチ領域が大きくなります。
Pill
shape="pill" は両端を完全に丸め、アイコンサイズは円になります。チャットのコンポーザーのように、角丸の面の内側に置くボタンに向いています。
アイコン付き
アイコンに data-icon="inline-start" または "inline-end" を付けると、その側のパディングが小さくなってバランスが取れます。
無効
focusableWhenDisabled は無効なボタンをタブ順に残すため、ツールチップや説明にキーボードで到達できます。
カスタムラベル
loadingLabel、successLabel、errorLabel は、状態ごとのテキストを置き換えます。古いラベルが反転して消えるのと同時に、新しいラベルが反転して現れます。
なめらかな幅
ボタンは、最も長いラベルのために幅を確保せず、各ラベルの幅にイージングして変化するため、周囲が跳ねることはありません。
エラーの詳細
errorLabel に関数を渡すと、拒否の理由を表示できます。ポインターまたはキーボードフォーカスがボタンにある間は、エラーが表示されたままになります。
フォーム
送信ボタンでは、onSubmit の中で useButtonFeedback の track() を呼び、buttonProps をボタンにスプレッドします。@ を削除するとエラーを確認できます。
アイコンボタン
アイコンサイズでは、状態ごとにアイコンだけが入れ替わり、正方形の形は保たれます。aria-label がアクセシブルな名前のままになります。
すべての variant でのフィードバック
塗りの variant は、完了時に緑または赤に変わります。ghost と link は、テキストの色だけが変わります。
制御された loading
作業が別の場所で追跡されている場合は、自分で loading を設定します。ボタンはフォーカス可能なままで、処理中であることを通知します。
制御された status
たとえばフォームライブラリの送信状態から、status を直接制御します。
リンクとして使う
render にアンカーを渡し、nativeButton={false} を設定すると、ボタンがリンクのセマンティクスを保ちます。
右から左
アイコンと状態のラベルは、読む方向に従います。
| キー | アクション |
|---|---|
| EnterSpace | ボタンを実行します。フィードバックのリクエスト実行中は無視されます。 |
| Tab | フォーカスを移動します。読み込み中のボタンもフォーカス可能なままで、エラーにフォーカスしている間は、フォーカスを外すまで表示されたままになります。 |
- 状態の変化はすべて polite なライブリージョンで通知されます。読み込み中、続いて成功またはエラーのラベルです。
- 読み込み中、ボタンは
aria-busyを設定したままフォーカス可能な状態を保つため、リクエストの途中でフォーカスが失われることはありません。 - スピナーは 150ms 後に初めて表示され、その後は最低 400ms 表示され続けます。そのため、高速なリクエストで一瞬表示されることも、遅いリクエストでちらつくこともありません。
- モーションの低減が有効な場合、状態のラベルは反転せずにフェードし、エラー時の揺れはスキップされます。
Base UI の button をベースにしています。<button> をレンダリングし、その属性をすべて受け付けます。
| プロパティ | 型 | デフォルト |
|---|---|---|
variant | "default" | "outline" | "secondary" | "ghost" | "ghost-destructive" | "destructive" | "link" | "default" |
size | "xs" | "sm" | "default" | "lg" | "icon-xs" | "icon-sm" | "icon" | "icon-lg" | "icon-xl" | "default" |
shape | "default" | "pill" | "default" |
feedbackonClick から返された Promise を追跡し、そのステータスを表示します。 | boolean | false |
onClickフィードバックを制御するには Promise を返します。 | (event) => unknown | – |
loading制御された loading の状態。 | boolean | – |
status制御された status。loading より優先されます。 | "idle" | "loading" | "success" | "error" | – |
onStatusChange | (status: ButtonStatus) => void | – |
onError拒否の理由とともに呼ばれます。 | (error: unknown) => void | – |
resetAfter待機状態に戻るまでのミリ秒。 | number | { success?: number; error?: number } | { success: 2000, error: 4000 } |
loadingLabelスピナーの隣に表示されます。アイコンサイズでは非表示になります。 | ReactNode | – |
successLabel | ReactNode | "Done" |
errorLabel | ReactNode | (error: unknown) => ReactNode | "Failed" |
disabled | boolean | false |
focusableWhenDisabled読み込み中は常に true です。 | boolean | false |
nativeButtonrender が <button> でない場合は false に設定します。 | boolean | true |
render | ReactElement | (props, state) => ReactElement | <button> |
| 属性 | 説明 |
|---|---|
data-slot="button" | CSS でボタンを指定します。 |
data-status | idle、loading、success、error のいずれか。feedback、loading、status を使うと付与されます。 |
data-disabled | ボタンが無効なときに付与されます。 |
aria-busy | 読み込み中に付与されます。 |
フォームの onSubmit など、どこからでも同じフィードバックの流れを実行します。resetAfter、onStatusChange、onError を受け付けます。タイミングの詳細は useButtonFeedback のガイドを参照してください。
| 戻り値 | 説明 |
|---|---|
track(action) | Promise、または Promise を返す関数を渡します。リクエスト実行中の呼び出しは無視されます。 |
buttonProps | <Button> にスプレッドすると、ステータスを表示し、ホバー時とフォーカス時にリセットを一時停止します。 |
status | 現在の ButtonStatus。 |
error | 直近の拒否の理由。 |
reset() | リクエストをキャンセルして、待機状態に戻ります。 |
isPending() | リクエストが実行中かどうか。 |
- SpinnerApple風の目盛りまたは呼吸するリングで表示する読み込みインジケーターです。表示までの待機と、ちらつかない最短表示時間を設定できます。
- useButtonFeedback非同期のアクションを、読み込み中、成功、エラーの順に実行します。高速なリクエストではスピナーをスキップし、エラーは読み終えるまで保持します。
- Button group1つのコントロールとして連結されたボタンです。共有される継ぎ目、区切り線、テキストアドオン、入れ子、縦積みに対応します。
- Toggleオンとオフを保持するボタンです。押すと塗りが定着し、ホバーからオンへの変化が明確で、アイコンを状態に合わせて塗りつぶせます。
- Toggle group単一または複数の選択に使うトグルの列です。選ばれた項目へ塗りがスライドし、項目は連結も間隔を空けた配置もでき、矢印キーでフォーカスを移動できます。
- Alertステータスやフィードバックを伝えるインラインメッセージです。ニュートラルなサーフェス、色付きのアイコン、滑らかに折りたたまれる閉じる操作を備えています。
使用しているブロック
Button の上に構築されるブロック。
- Prompt Input最初は静かな1行で、入力に合わせてカードへ広がり、会話が始まると下へ移動するチャット入力欄です。Enterで送信でき、日本語や中国語の入力でも安全です。ファイルは貼り付け、ドロップ、選択でき、プレビュー、進捗、再試行に対応します。@でファイルを追加し、/でコマンドをカーソル位置のメニューから実行できます。数字キーで選べるモデルピッカー、Maxで動き出す推論量スライダー、コンテキストリング、リアルタイム波形つきの音声入力、ツールチップ、返信のストリーミング中に入力したメッセージのキュー、再読み込みしても残る下書きを備えています。
- Agent Todosエージェントの作業中のプランを表示します。すべてのステップはバックログからToDo、進行中、完了へと移り、リアルタイムの所要時間、失敗、その裏にあるツール呼び出しも確認できます。コンポーザーの上に置くステータスピル、目に見えるプランの変更、実行前にプランを編集できるレビューステップを備えています。
- API keysOpenAIやAnthropicのコンソールのような、AIプロダクトのAPIキーのページです。スコープ付きの権限と有効期限を持つキーを作成し、シークレットは一度だけ表示され、コピーで確認でき、取り消しは元に戻せ、その場で名前を変更でき、猶予期間つきでローテーションでき、キーごとの使用量を確認できます。
- AppearanceAIプロダクトの設定にある外観セクションです。テーマ、アクセント、背景の色合い、密度、チャットのフォント、文字サイズ、アクセシビリティのオプションを、保存するまで下書きとして保持します。