Bubble
The chat bubble — 7 variants (default, muted, tinted, outline, ghost, destructive, secondary) with optional reactions.
Bubble est le rectangle coloré qui contient un message dans un chat. C'est un wrapper de positionnement (relative + max-width) qui applique aussi le fond et le padding selon un variant.
Deux enfants attendus :
- BubbleContent — le vrai texte / rich content du message. En pratique un simple
<span>— le style (padding, rounded, bg) est sur le parent Bubble. Ce sub-composant existe pour la parité API avec shadcn et pour queBubbleReactionspuisse cibler[data-slot=bubble-content]en CSS custom. - BubbleReactions — badge en absolute (bas-droite par défaut) qui contient des emojis ou boutons de réaction. Sort de la bulle via
translate-y-3/4, cadré d'unring-white. Optionnel.
7 variants définissent l'aspect :
default—bg-primary text-primary-foreground. Pour les messages envoyés par l'utilisateur courant (accent fort).secondary—bg-secondary text-secondary-foreground. Alternative moins saturée.muted—bg-muted text-foreground. Pour les messages reçus (interlocuteurs). Le plus courant en chat multi-party.tinted—bg-primary/10. Teinté accent, plus doux que default. Pour souligner sans crier.outline—border bg-background. Rectangle bordé sans fond, look "email draft".ghost— sans padding ni fond. Pour les longues notes assistant qui s'intègrent au flow textuel sans frame.destructive—bg-destructive/10 text-destructive. Pour les erreurs / warnings inline.
Pour empiler plusieurs bulles du même auteur (chaînes de messages courts, réactions séquentielles), envelopper dans BubbleGroup — flex flex-col gap-2 qui garde le rendu compact.
Combiné à Message pour l'alignement gauche/droite + avatar, ça forme la primitive de tout thread conversationnel.
Installation
$ bext ui add bubble
Usage
Anatomy
<Bubble variant="default|secondary|muted|tinted|outline|ghost|destructive" align="start|end">
├── <BubbleContent>text or rich content</BubbleContent>
└── <BubbleReactions> // optionnel, absolute badge
└── <span>👍</span> // emoji ou <button>
<BubbleGroup> // empile 2+ Bubble du même auteur
├── <Bubble>...</Bubble>
└── <Bubble>...</Bubble>API Reference
Bubble
| Prop | Type | Default | Description |
|---|---|---|---|
| variant | "default" | "secondary" | "muted" | "tinted" | "outline" | "ghost" | "destructive" | "default" | Détermine le fond, la couleur du texte, la présence d'une bordure et du padding. |
| align | "start" | "end" | "start" | Alignement de la bulle dans son parent flex. Utilisé principalement quand Bubble est direct child d'un container flex (sans Message). |
| className | string | — | Classes CSS supplémentaires sur le root . |
BubbleContent
| Prop | Type | Default | Description |
|---|---|---|---|
| className | string | — | Wrapper sémantique du contenu (span). Pas de style propre — le padding/bg vit sur Bubble. |
BubbleGroup
| Prop | Type | Default | Description |
|---|---|---|---|
| className | string | — | Container flex-col gap-2 pour empiler plusieurs Bubble du même auteur. |
BubbleReactions
| Prop | Type | Default | Description |
|---|---|---|---|
| side | "top" | "bottom" | "bottom" | Position verticale relative à la bulle. "bottom" → sous, "top" → au-dessus. |
| align | "start" | "end" | "end" | Alignement horizontal. "start" → left-3, "end" → right-3. |
| className | string | — | Classes CSS supplémentaires. Le badge est absolute z-10 avec bg-muted + ring-white. |
Data Attributes
Attributs qu'on peut cibler en CSS custom pour override le style par état.
| Attribute | On | Values | Description |
|---|---|---|---|
| data-slot | chaque sub-composant | "bubble" | "bubble-content" | "bubble-group" | "bubble-reactions" | Sélecteur stable pour du styling custom. |
| data-variant | Bubble | "default" | "secondary" | ... | Reflète la prop variant. Utile pour custom overrides via [data-variant=X] { ... }. |
| data-align | Bubble + BubbleReactions | "start" | "end" | Reflète la prop align. Pour cibler les cas d'alignement en CSS custom. |
| data-side | BubbleReactions | "top" | "bottom" | Position verticale. |
Keyboard
| Key | Action |
|---|---|
| Tab | Focus le premier bouton dans BubbleReactions (si présent). |
| Enter / Space | Active le bouton focus dans une reaction. |
Accessibility
Une Bubble seule est un container visuel — pas de rôle ARIA. Le texte est directement lisible par les AT.
BubbleReactions avec un emoji doit porter un aria-label descriptif car l'emoji seul n'est pas suffisant. Exemple : <BubbleReactions aria-label="Réaction : pouce en l'air"><span>👍</span></BubbleReactions>. Les boutons de réaction doivent aussi porter chacun leur aria-label.
Le variant destructive utilise text-destructive qui a un contraste suffisant en light + dark mode (validé WCAG AA sur les tokens shadcn). Vérifier si tu override la palette.
Pour un thread complet accessible, envelopper les Bubbles dans un <Message> avec avatar (identification de l'auteur) et poser role="log" aria-live="polite" sur le container du thread.
Examples
Variants
Alignment (start / end)
BubbleGroup — empiler du même auteur
BubbleReactions
Ghost (assistant long-form)
On This Page