Bubble
バリアント、グループ化された角、リアクション、インタラクティブなコンテンツの余地を備えたチャットのメッセージバブルです。
pnpm dlx shadcn@latest add https://hextaui.com/r/bubble.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @base-ui/react class-variance-authority cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/bubble.tsx インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
バリアント
力強い primary のバブルから、アシスタントの返信向けの枠なしの ghost コンテンツまで、7 種類の表現があります。destructive は面を染め、内側のアイコンにも色を付けます。
配置
align="end" は、現在のユーザーのメッセージとして、バブルを行の終端に寄せます。読む方向に従います。
グループ
同じ送信者の連続するメッセージを <BubbleGroup /> で囲みます。送信者側の角が小さくなって連なりが 1 つのまとまりに見え、単独のバブルは完全な丸みを保ちます。
形
グループに shape を設定すると、そのすべてのバブルのスタイルが決まり、単一のバブルにも設定できます。デフォルトは joined です。
しっぽ
shape="tail" は、連なりの最後のバブルに、バブルと同じ色のしっぽを描画します。outline と ghost のバブルには付きません。
リアクション
<BubbleReactions /> はバブルの端に重なり、自分の分のスペースを確保するため、次の行に余白を追加する必要はありません。静的な行には role="img" とラベルを付け、インタラクティブなリアクションにはボタンを使います。
さらに表示
バブルのコンテンツとして <Collapsible /> をレンダリングすると、長いメッセージを折りたためます。バブルはなめらかに広がり、隠れたテキストも検索可能なままです。
Tooltip
バブルをツールチップのトリガーとしてレンダリングすると、既読時刻などの詳細を表示できます。キーボードユーザーが到達できるよう tabIndex を追加してください。
Popover
コンテンツを <button> としてレンダリングすると、バブル全体がポップオーバーのトリガーになります。たとえば、配信失敗の理由を説明するときに使えます。
長いコンテンツ
区切りのない文字列、URL、絵文字、CJK のテキストは、狭いカラムではみ出さず、バブル内で折り返されます。
ネストした返信
別のバブルの内側にある引用バブルは、親と同心の角丸を保ちます。
右から左
配置、連結した角、しっぽ、リアクションはすべて、右から左のレイアウトで反転します。
- バブルはプレーンなコンテナです。新しいメッセージを通知したい場合は、会話をリストまたは
role="log"のリージョンで囲んでください。 - 絵文字のみのリアクション行には、
role="img"と、リアクションを文章で説明するaria-labelが必要です。 - ボタンやリンクとしてレンダリングされたインタラクティブなコンテンツには、バブルの角に沿ったフォーカスリングが付きます。
各パーツはデフォルトで <div> をレンダリングし、その属性に加えて、要素を差し替える render prop を受け付けます。
| プロパティ | 型 | デフォルト |
|---|---|---|
variant | "default" | "secondary" | "muted" | "tinted" | "outline" | "ghost" | "destructive" | "default" |
align | "start" | "end" | "start" |
shape未設定の場合は BubbleGroup から継承されます。 | "uniform" | "joined" | "tail" | "joined" |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="bubble" | CSS でバブルを指定します。 |
data-variant | 現在のバリアント。 |
data-align | 現在の配置。 |
data-shape | 解決された形。 |
--bubble-bg | 面の色。しっぽにも使われます。 |
--bubble-fg | テキストの色。 |
--bubble-border | リングの色。 |
--bubble-radius | 角丸の半径。 |
--bubble-radius-joined | グループ化されたバブル間で使われる、より小さい角丸。 |
--bubble-accent | コンテンツ内のアイコンの色。destructive で設定されます。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
render<button> または <a> をレンダリングすると、インタラクティブになります。 | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="bubble-content" | CSS でバブルの面を指定します。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
shapeグループ内のすべてのバブルに適用されます。 | "uniform" | "joined" | "tail" | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="bubble-group" | CSSでグループを指定します。 |
data-shape | 設定されている場合のグループの形。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
side | "top" | "bottom" | "bottom" |
align | "start" | "end" | "end" |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="bubble-reactions" | CSS でリアクション行を指定します。 |
data-side | 現在の側。 |
data-align | 現在の配置。 |
- Attachmentアップロード向けのファイルカードと画像カードです。進捗、状態、操作、カード全体のトリガーに対応し、名前は拡張子を保ったまま表示されます。
- Marker日付の区切りやシステムイベントのように、コンテンツの間に置く控えめなメモです。日付と時刻はスティッキーで、「今日」や「昨日」と表示されます。
- Messageアバター、名前、バブル、ステータスを備えたチャットのメッセージ行です。新しいメッセージは送信者の側からせり上がって表示されます。
- Message scroller新しいメッセージに追従し、過去を読み返している間は位置を保ち、見逃した件数をジャンプボタンに表示するチャットのスクロール領域です。
使用しているブロック
Bubble の上に構築されるブロック。
- Prompt Input最初は静かな1行で、入力に合わせてカードへ広がり、会話が始まると下へ移動するチャット入力欄です。Enterで送信でき、日本語や中国語の入力でも安全です。ファイルは貼り付け、ドロップ、選択でき、プレビュー、進捗、再試行に対応します。@でファイルを追加し、/でコマンドをカーソル位置のメニューから実行できます。数字キーで選べるモデルピッカー、Maxで動き出す推論量スライダー、コンテキストリング、リアルタイム波形つきの音声入力、ツールチップ、返信のストリーミング中に入力したメッセージのキュー、再読み込みしても残る下書きを備えています。
- Agent Todosエージェントの作業中のプランを表示します。すべてのステップはバックログからToDo、進行中、完了へと移り、リアルタイムの所要時間、失敗、その裏にあるツール呼び出しも確認できます。コンポーザーの上に置くステータスピル、目に見えるプランの変更、実行前にプランを編集できるレビューステップを備えています。
- Chat Sidebarチャットアプリ向けのサイドバーです。上部にロゴ、検索、New chat、その下に独自のリンク、ピン留めされたチャット、チャットを表示するために展開するプロジェクト、日ごとにグループ化された最近のチャットを配置します。行にはホバーメニューと右クリックメニュー、インラインでの名前変更、取り消しできる削除、リアルタイムの返信状態があります。
- Chat Threadコンポーザーを中心にした会話全体です。回答のストリーミング中も質問は上部に固定され、サイドのチェックポイントでメッセージ間を移動でき、すべての返信をコピー、編集、再試行、評価し、バージョン間で切り替えられます。返信はコードブロック、テーブル、引用を含むMarkdownとして描画され、思考、ツール呼び出し、Prompt Inputもそのまま組み込めます。