Bubble
Chat-Nachrichten-Bubbles mit Varianten, gruppierten Ecken, Reaktionen und Platz für interaktive Inhalte.
pnpm dlx shadcn@latest add https://hextaui.com/r/bubble.jsonFügt die Komponente, die HextaUI-Theme-Tokens und alle HextaUI-Komponenten hinzu, von denen sie abhängt.
Füge die Theme-Tokens zu deinem globalen CSS hinzu, falls du das noch nicht getan hast.
Installiere die Abhängigkeiten.
pnpm add @base-ui/react class-variance-authority cnKopiere den folgenden Code und füge ihn in dein Projekt ein.
components/ui/bubble.tsx Passe die Importpfade an dein Projekt-Setup an.
Varianten
Sieben Ausprägungen, von einer kräftigen primären Bubble bis zu rahmenlosem ghost-Inhalt für Assistenten-Antworten. destructive tönt die Fläche und färbt Icons darin ein.
Ausrichtung
align="end" schiebt eine Bubble für Nachrichten des aktuellen Nutzers ans Zeilenende. Es folgt der Leserichtung.
Gruppe
Umschließe aufeinanderfolgende Nachrichten eines Absenders mit <BubbleGroup />. Die Ecken auf der Absenderseite werden enger, sodass die Folge als ein Block wirkt, und eine einzelne Bubble bleibt vollständig rund.
Formen
Setze shape auf einer Gruppe, um alle ihre Bubbles zu stylen, oder auf einer einzelnen Bubble. joined ist der Standard.
Tail
shape="tail" zeichnet einen Tail an der letzten Bubble einer Folge, passend zur Bubble-Farbe. Outline- und Ghost-Bubbles lassen ihn aus.
Reaktionen
<BubbleReactions /> überlappt den Rand der Bubble und reserviert seinen eigenen Platz, sodass die nächste Zeile keinen zusätzlichen Abstand braucht. Gib einer statischen Reihe role="img" und ein Label, oder verwende Buttons für interaktive Reaktionen.
Mehr anzeigen
Rendere ein <Collapsible /> als Bubble-Inhalt, um lange Nachrichten einzuklappen. Die Bubble wächst sanft, und der verborgene Text bleibt durchsuchbar.
Tooltip
Rendere eine Bubble als Tooltip-Trigger, um Details wie die Lesezeit anzuzeigen. Füge tabIndex hinzu, damit Tastaturnutzer sie erreichen.
Popover
Rendere den Inhalt als <button>, um die ganze Bubble zum Popover-Trigger zu machen, zum Beispiel um eine fehlgeschlagene Zustellung zu erklären.
Langer Inhalt
Strings ohne Umbruchstelle, URLs, Emoji und CJK-Text werden in der Bubble umgebrochen, statt eine schmale Spalte zu sprengen.
Verschachtelte Antwort
Eine zitierte Bubble in einer anderen hält die Radien konzentrisch zu ihrer übergeordneten.
Rechts nach links
Ausrichtung, verbundene Ecken, Tails und Reaktionen werden in Rechts-nach-links-Layouts gespiegelt.
- Bubbles sind einfache Container. Umschließe eine Unterhaltung mit einer Liste oder einer
role="log"-Region, wenn neue Nachrichten angesagt werden sollen. - Reaktionsreihen nur aus Emoji brauchen
role="img"und einaria-label, das die Reaktionen ausschreibt. - Interaktiver Inhalt, der als Button oder Link gerendert wird, erhält einen Fokusring, der den Ecken der Bubble folgt.
Jeder Teil rendert standardmäßig ein <div> und akzeptiert dessen Attribute, plus eine render-Prop, um das Element auszutauschen.
| Prop | Typ | Standard |
|---|---|---|
variant | "default" | "secondary" | "muted" | "tinted" | "outline" | "ghost" | "destructive" | "default" |
align | "start" | "end" | "start" |
shapeWird von BubbleGroup übernommen, wenn nicht gesetzt. | "uniform" | "joined" | "tail" | "joined" |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="bubble" | Bubbles in CSS ansprechen. |
data-variant | Die aktuelle Variante. |
data-align | Die aktuelle Ausrichtung. |
data-shape | Die aufgelöste Form. |
--bubble-bg | Die Flächenfarbe, die auch der Tail verwendet. |
--bubble-fg | Die Textfarbe. |
--bubble-border | Die Ringfarbe. |
--bubble-radius | Der Eckenradius. |
--bubble-radius-joined | Der engere Radius zwischen gruppierten Bubbles. |
--bubble-accent | Icon-Farbe im Inhalt. Wird von destructive gesetzt. |
| Prop | Typ | Standard |
|---|---|---|
renderRendere einen <button> oder <a>, um sie interaktiv zu machen. | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="bubble-content" | Die Bubble-Fläche in CSS ansprechen. |
| Prop | Typ | Standard |
|---|---|---|
shapeGilt für jede Bubble in der Gruppe. | "uniform" | "joined" | "tail" | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="bubble-group" | Gruppen in CSS ansprechen. |
data-shape | Die Form der Gruppe, sofern gesetzt. |
| Prop | Typ | Standard |
|---|---|---|
side | "top" | "bottom" | "bottom" |
align | "start" | "end" | "end" |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="bubble-reactions" | Reaktionsreihen in CSS ansprechen. |
data-side | Die aktuelle Seite. |
data-align | Die aktuelle Ausrichtung. |
- AttachmentDatei- und Bildkarten für Uploads, mit Fortschritt, Zuständen, Aktionen, einem Trigger über die ganze Karte und Namen, die ihre Dateiendung behalten.
- MarkerLeise Hinweise zwischen Inhalten, etwa Datumstrenner und Systemereignisse, mit Sticky-Datums- und Zeitangaben, die als Heute oder Gestern gelesen werden.
- MessageEine Chat-Nachrichtenzeile mit Avatar, Name, Bubbles und Status, in der neue Nachrichten von der Seite des Absenders hereinsteigen.
- Message scrollerEin Chat-Scrollbereich, der neuen Nachrichten folgt, beim Zurücklesen deine Position hält und auf dem Sprung-Button zählt, was du verpasst hast.
In Blocks verwendet
Blocks, die auf Bubble aufbauen.
- Prompt InputEin Chat-Composer, der als ruhige einzelne Zeile beginnt, beim Schreiben zu einer Karte wächst und nach unten wandert, sobald die Unterhaltung beginnt. Enter sendet, sicher bei japanischer und chinesischer Eingabe. Dateien per Einfügen, Ablegen oder Auswählen hinzufügen, mit Vorschau, Fortschritt und Wiederholen. @ fügt Dateien hinzu und / führt Befehle aus einem Menü an der Einfügemarke aus. Ein Modellwähler mit Zifferntasten, ein Effort-Slider, der bei Max lebendig wird, ein Kontextring, Diktat mit Live-Wellenform, Tool-Chips, eine Warteschlange für Nachrichten, die während einer streamenden Antwort getippt werden, und Entwürfe, die einen Reload überstehen.
- Agent TodosZeige den Plan eines Agenten, während er arbeitet. Jeder Schritt wandert von Backlog über To do und In Arbeit zu Erledigt, mit Live-Zeiten, Fehlern und den dahinterliegenden Tool-Aufrufen. Eine Status-Pille für über dem Composer, sichtbare Planänderungen und ein Review-Schritt, um den Plan vor der Ausführung zu bearbeiten.
- Chat SidebarDie Seitenleiste für eine Chat-App. Logo, Suche und Neuer Chat oben, deine eigenen Links darunter, angeheftete Chats, Projekte, die sich aufklappen und ihre Chats zeigen, zuletzt verwendete nach Tag gruppiert und Zeilen mit Hover- und Rechtsklick-Menüs, direktem Umbenennen, Löschen mit Rückgängig und Live-Antwortzuständen.
- Chat ThreadDie ganze Unterhaltung rund um den Composer. Deine Frage bleibt oben angeheftet, während die Antwort streamt, Checkpoints an der Seite springen zwischen Nachrichten, und jede Antwort lässt sich kopieren, bearbeiten, wiederholen, bewerten und zwischen Versionen umschalten. Antworten rendern Markdown mit Codeblöcken, Tabellen und Zitaten, und Thinking, Tool-Aufrufe und Prompt Input lassen sich direkt einsetzen.