Avatar
イニシャルのフォールバック、ステータスバッジ、件数にまとめられる積み重ねグループを備えたユーザー写真です。
pnpm dlx shadcn@latest add https://hextaui.com/r/avatar.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/avatar.tsx インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
サイズと形
円形または正方形の 5 つのサイズ。イニシャルとユーザーアイコンはボックスに合わせて拡大縮小し、正方形の角丸はサイズに応じて小さくなります。空の <AvatarFallback /> はユーザーアイコンを表示します。
読み込み中
写真の読み込み中はイニシャルが表示され、その上に写真がフェードインします。写真が壊れている場合は、フォールバックが維持されます。delay を渡すとイニシャルの表示を待つため、速く読み込まれた写真でイニシャルが一瞬見えることはありません。
イニシャル
getInitials() は最初と最後のイニシャルを選びます。メールアドレス、絵文字、CJK や RTL の名前、結合文字、文字をまったく含まない名前にも対応します。
ステータス
<AvatarBadge /> は、どのサイズや形でも縁に配置されます。status を設定すると、アクセシブルなラベル付きの色付きドットが表示され、アイコンを渡すこともできます。ステータスを変更すると、パルスが 1 回再生されます。
グループ
<AvatarGroup /> はアバターを重ねて、サイズと形を設定します。max を指定すると、残りは件数にまとめられます。
リンク付きグループ
render でアバターをリンクとしてレンダリングし、それぞれに aria-label を付けます。フォーカス中のアバターは隣より前面に出るため、リングが切れることはありません。合計がデータから来る場合は、自分で <AvatarGroupCount /> を追加してください。
レイアウト
窮屈な行でも、アバターが縮むことはありません。size-20 のようなサイズクラスを指定すると、イニシャルとバッジも一緒に拡大縮小し、長いイニシャルもはみ出しません。
右から左
バッジは終了側の角に留まり、RTL では左側になります。グループは右から重なります。
アバター自体はフォーカスできません。リンクやボタンとしてレンダリングすると、通常のキー操作が使えます。
| キー | アクション |
|---|---|
| Tab | フォーカスを次のリンク付きアバターに移動します。 |
| Enter | フォーカス中のリンクに追従します。 |
- アバターの隣にすでに本人の名前がある場合は
alt=""を使い、ない場合は本人の名前を alt テキストにします。 statusを持つバッジは、「Online」「Away」「Busy」「Offline」と通知されます。Offline はリングで描画されるため、ステータスが色だけに頼ることはありません。- グループには
role="group"が付きます。件数は「+3」ではなく「3 more」と読み上げられます。 - モーションの低減が有効な場合、写真はフェードせずに表示され、ステータスの変更でパルスは再生されません。
Base UI の avatar をベースにしています。各パーツは、レンダリングする要素の属性をすべて受け付けます。スタイルは avatarVariants と avatarBadgeVariants としてエクスポートされています。
| プロパティ | 型 | デフォルト |
|---|---|---|
size省略すると、グループから継承されます。 | "xs" | "sm" | "default" | "lg" | "xl" | "default" |
shape省略すると、グループから継承されます。 | "circle" | "square" | "circle" |
render | ReactElement | (props, state) => ReactElement | <span> |
| 属性 | 説明 |
|---|---|
data-slot="avatar" | CSS でアバターを指定します。 |
data-size | 解決されたサイズ。 |
data-shape | 解決された形。 |
--avatar-radius | すべてのレイヤーで共有される角丸の半径。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
src | string | – |
alt | string | – |
onLoadingStatusChange | (status: "idle" | "loading" | "loaded" | "error") => void | – |
keepMounted画像をプリロードせず、その場で読み込みます。loading="lazy" や next/image 向けです。 | boolean | false |
render | ReactElement | (props, state) => ReactElement | <img> |
| 属性 | 説明 |
|---|---|
data-slot="avatar-image" | CSS で画像を指定します。 |
data-loading | 画像の読み込み中、付与されます。 |
data-error | 画像の読み込みに失敗したときに付与されます。 |
data-starting-style | 画像がフェードインしている間、付与されます。 |
data-ending-style | 画像がフェードアウトしている間、付与されます。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
children空文字または空白のみの場合は、ユーザーアイコンが表示されます。 | ReactNode | <IconUser /> |
delay表示するまでの待機時間(ミリ秒)。 | number | 0 |
render | ReactElement | (props, state) => ReactElement | <span> |
| 属性 | 説明 |
|---|---|
data-slot="avatar-fallback" | CSS でフォールバックを指定します。 |
data-ready | 遅延時間が経過するまでは false です。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
statusドットに色を付け、支援技術向けにラベルを付けます。指定しない場合、バッジは primary カラーを使います。 | "online" | "away" | "busy" | "offline" | – |
childrenバッジ内のアイコン。xs と sm のサイズでは非表示になります。 | ReactNode | – |
| 属性 | 説明 |
|---|---|
data-slot="avatar-badge" | CSS でバッジを指定します。 |
data-status | 現在のステータス。 |
data-slot="avatar-badge-pulse" | ステータスの変更後に再生されるパルス。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
size | "xs" | "sm" | "default" | "lg" | "xl" | "default" |
shape | "circle" | "square" | "circle" |
max件数を含めて表示する項目数。2 未満の値は 2 に引き上げられます。 | number | – |
| 属性 | 説明 |
|---|---|
data-slot="avatar-group" | CSSでグループを指定します。 |
data-size | グループのサイズ。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
count+3 のように表示され、99 を超えると 99+ になります。 | number | – |
children件数の代わりに、たとえばアイコンを表示します。 | ReactNode | – |
size省略すると、グループから継承されます。 | "xs" | "sm" | "default" | "lg" | "xl" | – |
shape省略すると、グループから継承されます。 | "circle" | "square" | – |
| 属性 | 説明 |
|---|---|
data-slot="avatar-group-count" | CSSでカウントを指定します。 |
data-size | 解決されたサイズ。 |
data-shape | 解決された形。 |
getInitials(name, max = 2) は、最大 max 個の大文字のイニシャルを返します。最初の単語と最後の単語のイニシャルです。メールアドレスの場合は @ より前の部分を使います。名前に文字、数字、絵文字がない場合は空文字列を返すため、フォールバックにはユーザーアイコンが表示されます。
- Badge色付きのドットを持つステータスラベル、スライドして閉じる削除可能なタグ、新しい値へ回転するカウントです。
- Cardコンテンツをまとめるサーフェスです。3つのバリアント、端まで広がるメディア、同心円状の角丸、カード全体のリンクに対応します。
- Chartテーマ対応の色を持つRechartsのチャートです。1つの設定からラベルを読み取るツールチップと凡例、見えるフォーカスリングつきのキーボード操作に対応します。
- Data table実データのためのテーブルです。並べ替え、検索、行の選択、固定列、スティッキーヘッダー、ページネーションを備えています。
- Itemリスト、設定、ピッカー向けに、メディア、テキスト、操作を並べた行です。グループ化されたサーフェスと、行の間を滑るように移動するホバーハイライトを備えています。
- Kbdショートカット用のキーキャップです。プラットフォームごとに正しい記号を表示し、正しく読み上げ、実際のキーと同じように押し込まれます。
使用しているブロック
Avatar の上に構築されるブロック。
- Chat Sidebarチャットアプリ向けのサイドバーです。上部にロゴ、検索、New chat、その下に独自のリンク、ピン留めされたチャット、チャットを表示するために展開するプロジェクト、日ごとにグループ化された最近のチャットを配置します。行にはホバーメニューと右クリックメニュー、インラインでの名前変更、取り消しできる削除、リアルタイムの返信状態があります。
- Diff Reviewエージェントによる編集を、反映される前にファイルをまたいで確認します。件数つきのファイルツリー、変更ごと、ファイルごと、またはすべてに対する承認と却下、任意の行や範囲に付けてエージェントへ返せるコメント、ユニファイドビューとスプリットビュー、単語単位のハイライト、取り消し、ストリーミングされる編集、チャット向けの「Edited 4 files」サマリーを備えています。
- ProfileAIプロダクトの設定にあるプロフィールセクションです。写真を円形に切り抜き、入力しながら確認されるユーザー名を選び、6桁のコードで新しいメールアドレスを確認し、サイトを認識するリンクを追加し、他の人からどう見えるかをライブのカードで確認できます。
- SettingsCursorやClaudeのように構成した、AIプロダクト向けの設定です。検索、グループ、外部リンクを備えた塗りつぶしのサイドバー、控えめなピッカーと入れ子のオプションを持つ行のカード、変更があったときだけ浮かび上がる暗い保存アイランド、⌘Sでの保存、チェックやサーバーからのフィールドエラー、コンテンツの形に合わせた読み込み状態を備えています。