Bubble
Des bulles de messages de chat avec variantes, coins groupés, réactions et place pour du contenu interactif.
pnpm dlx shadcn@latest add https://hextaui.com/r/bubble.jsonAjoute le composant, les tokens de thème HextaUI et les composants HextaUI dont il dépend.
Ajoutez les tokens de thème à votre CSS global, si ce n’est pas déjà fait.
Installez les dépendances.
pnpm add @base-ui/react class-variance-authority cnCopiez et collez le code suivant dans votre projet.
components/ui/bubble.tsx Mettez à jour les chemins d’import selon la configuration de votre projet.
Variantes
Sept traitements, d’une bulle primaire marquée à un contenu ghost sans cadre pour les réponses de l’assistant. destructive teinte la surface et colore les icônes à l’intérieur.
Alignement
align="end" pousse une bulle à la fin de la ligne pour les messages de l’utilisateur actuel. Elle suit le sens de lecture.
Groupe
Enveloppez les messages consécutifs d’un même expéditeur dans <BubbleGroup />. Les coins du côté de l’expéditeur se resserrent pour que la série se lise comme un seul bloc, et une bulle isolée reste entièrement arrondie.
Formes
Définissez shape sur un groupe pour styliser toutes ses bulles, ou sur une seule bulle. joined est la valeur par défaut.
Queue
shape="tail" dessine une queue sur la dernière bulle d’une série, de la couleur de la bulle. Les bulles outline et ghost l’ignorent.
Réactions
<BubbleReactions /> chevauche le bord de la bulle et réserve son propre espace : la ligne suivante n’a donc besoin d’aucun écart supplémentaire. Donnez à une ligne statique role="img" et une étiquette, ou utilisez des boutons pour des réactions interactives.
Voir plus
Rendez un <Collapsible /> comme contenu de la bulle pour replier les longs messages. La bulle s’agrandit en douceur et le texte masqué reste recherchable.
Tooltip
Rendez une bulle comme déclencheur de tooltip pour afficher des détails comme l’heure de lecture. Ajoutez tabIndex pour que les utilisateurs du clavier puissent l’atteindre.
Popover
Rendez le contenu comme un <button> pour faire de toute la bulle un déclencheur de popover, par exemple pour expliquer un échec de remise.
Contenu long
Les chaînes sans coupure, les URL, les emoji et le texte CJK passent à la ligne dans la bulle au lieu de déborder d’une colonne étroite.
Réponse imbriquée
Une bulle citée à l’intérieur d’une autre garde des rayons concentriques avec son parent.
De droite à gauche
L’alignement, les coins joints, les queues et les réactions s’inversent tous dans les mises en page de droite à gauche.
- Les bulles sont de simples conteneurs. Enveloppez une conversation dans une liste ou une région
role="log"si les nouveaux messages doivent être annoncés. - Les lignes de réactions composées uniquement d’emoji nécessitent
role="img"et unaria-labelqui énonce les réactions. - Un contenu interactif rendu en bouton ou en lien reçoit un anneau de focus qui suit les coins de la bulle.
Chaque partie rend un <div> par défaut et accepte ses attributs, ainsi qu’une prop render pour remplacer l’élément.
| Prop | Type | Par défaut |
|---|---|---|
variant | "default" | "secondary" | "muted" | "tinted" | "outline" | "ghost" | "destructive" | "default" |
align | "start" | "end" | "start" |
shapeHérité de BubbleGroup si non défini. | "uniform" | "joined" | "tail" | "joined" |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="bubble" | Ciblez les bulles en CSS. |
data-variant | La variante actuelle. |
data-align | L’alignement actuel. |
data-shape | La forme résolue. |
--bubble-bg | La couleur de la surface, également utilisée par la queue. |
--bubble-fg | La couleur du texte. |
--bubble-border | La couleur de l’anneau. |
--bubble-radius | Le rayon des coins. |
--bubble-radius-joined | Le rayon plus serré utilisé entre les bulles groupées. |
--bubble-accent | Couleur des icônes dans le contenu. Définie par destructive. |
| Prop | Type | Par défaut |
|---|---|---|
renderRendez un <button> ou un <a> pour le rendre interactif. | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="bubble-content" | Ciblez la surface de la bulle en CSS. |
| Prop | Type | Par défaut |
|---|---|---|
shapeS’applique à chaque bulle du groupe. | "uniform" | "joined" | "tail" | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="bubble-group" | Ciblez les groupes en CSS. |
data-shape | La forme du groupe, si elle est définie. |
| Prop | Type | Par défaut |
|---|---|---|
side | "top" | "bottom" | "bottom" |
align | "start" | "end" | "end" |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="bubble-reactions" | Ciblez les lignes de réactions en CSS. |
data-side | Le côté actuel. |
data-align | L’alignement actuel. |
- AttachmentDes cartes de fichiers et d’images pour les uploads, avec progression, états, actions, un déclencheur sur toute la carte et des noms qui conservent leur extension.
- MarkerDes notes discrètes entre les contenus, comme les séparateurs de date et les événements système, avec des dates et heures fixes qui se lisent « Aujourd’hui » ou « Hier ».
- MessageUne ligne de message de chat avec avatar, nom, bulles et statut, où les nouveaux messages remontent depuis le côté de l’expéditeur.
- Message scrollerUne zone de défilement de chat qui suit les nouveaux messages, garde votre position quand vous remontez et compte les messages manqués sur le bouton de retour en bas.
Utilisé dans les blocks
Des blocks qui s’appuient sur Bubble.
- Prompt InputUn champ de discussion qui démarre sur une seule ligne sobre, grandit en carte à mesure que vous écrivez et descend une fois la conversation lancée. Entrée envoie, sans risque avec la saisie japonaise et chinoise. Collez, déposez ou choisissez des fichiers avec aperçus, progression et nouvel essai. @ ajoute des fichiers et / lance des commandes depuis un menu au niveau du curseur. Un sélecteur de modèle avec touches numériques, un curseur d’effort qui s’anime à Max, un anneau de contexte, la dictée avec forme d’onde en direct, des chips d’outils, une file pour les messages saisis pendant qu’une réponse arrive en streaming, et des brouillons qui survivent à un rechargement.
- Agent TodosAffichez le plan d’un agent pendant son travail. Chaque étape passe de backlog à à faire, en cours puis terminé, avec des durées en direct, les échecs et les appels d’outils qui les sous-tendent. Une pastille de statut à placer au-dessus du champ de saisie, des changements de plan visibles et une étape de relecture pour modifier le plan avant son exécution.
- Chat SidebarLa barre latérale d’une application de chat. Logo, recherche et Nouveau chat en haut, vos propres liens en dessous, chats épinglés, projets qui se déploient pour montrer leurs chats, récents regroupés par jour, et des lignes avec menus au survol et au clic droit, renommage en ligne, suppression avec annulation et états de réponse en direct.
- Chat ThreadToute la conversation autour du champ de saisie. Votre question reste épinglée en haut pendant que la réponse arrive en streaming, des points de repère sur le côté permettent de sauter d’un message à l’autre, et chaque réponse peut être copiée, modifiée, relancée, notée et basculée entre versions. Les réponses affichent du Markdown avec blocs de code, tableaux et citations, et la réflexion, les appels d’outils et Prompt Input s’y insèrent directement.