Bubble
Burbujas de mensajes de chat con variantes, esquinas agrupadas, reacciones y espacio para contenido interactivo.
pnpm dlx shadcn@latest add https://hextaui.com/r/bubble.jsonAñade el componente, los tokens del tema de HextaUI y los componentes de HextaUI de los que depende.
Añade los tokens del tema a tu CSS global, si aún no lo has hecho.
Instala las dependencias.
pnpm add @base-ui/react class-variance-authority cnCopia y pega el siguiente código en tu proyecto.
components/ui/bubble.tsx Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
Variantes
Siete tratamientos, desde una burbuja primaria intensa hasta contenido ghost sin marco para las respuestas del asistente. destructive tiñe la superficie y colorea los iconos que contiene.
Alineación
align="end" empuja una burbuja al final de la fila para los mensajes del usuario actual. Sigue la dirección de lectura.
Group
Envuelve los mensajes consecutivos de un mismo remitente en <BubbleGroup />. Las esquinas del lado del remitente se estrechan para que la tanda se lea como un solo bloque, y una burbuja aislada permanece totalmente redonda.
Formas
Define shape en un grupo para dar estilo a todas sus burbujas, o en una sola burbuja. joined es el valor por defecto.
Cola
shape="tail" dibuja una cola en la última burbuja de una tanda, del mismo color que la burbuja. Las burbujas outline y ghost la omiten.
Reacciones
<BubbleReactions /> se superpone al borde de la burbuja y reserva su propio espacio, así que la fila siguiente no necesita separación extra. Dale a una fila estática role="img" y una etiqueta, o usa botones para reacciones interactivas.
Mostrar más
Renderiza un <Collapsible /> como contenido de la burbuja para plegar mensajes largos. La burbuja crece suavemente y el texto oculto sigue siendo buscable.
Tooltip
Renderiza una burbuja como trigger de un tooltip para mostrar detalles como la hora de lectura. Añade tabIndex para que los usuarios de teclado puedan llegar a ella.
Popover
Renderiza el contenido como un <button> para que toda la burbuja sea el trigger de un popover, por ejemplo para explicar una entrega fallida.
Contenido largo
Las cadenas sin espacios, las URL, los emoji y el texto CJK se ajustan dentro de la burbuja en lugar de desbordar una columna estrecha.
Respuesta anidada
Una burbuja citada dentro de otra mantiene los radios concéntricos con su padre.
De derecha a izquierda
La alineación, las esquinas unidas, las colas y las reacciones se reflejan en diseños de derecha a izquierda.
- Las burbujas son contenedores simples. Envuelve una conversación en una lista o en una región
role="log"si los mensajes nuevos deben anunciarse. - Las filas de reacciones solo con emoji necesitan
role="img"y unaria-labelque detalle las reacciones. - El contenido interactivo renderizado como botón o enlace recibe un anillo de foco que sigue las esquinas de la burbuja.
Cada parte renderiza un <div> por defecto y acepta sus atributos, además de una prop render para cambiar el elemento.
| Prop | Tipo | Predeterminado |
|---|---|---|
variant | "default" | "secondary" | "muted" | "tinted" | "outline" | "ghost" | "destructive" | "default" |
align | "start" | "end" | "start" |
shapeSe hereda de BubbleGroup si no se define. | "uniform" | "joined" | "tail" | "joined" |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="bubble" | Selecciona las burbujas en CSS. |
data-variant | La variante actual. |
data-align | La alineación actual. |
data-shape | La forma resuelta. |
--bubble-bg | El color de la superficie, que también usa la cola. |
--bubble-fg | El color del texto. |
--bubble-border | El color del anillo. |
--bubble-radius | El radio de las esquinas. |
--bubble-radius-joined | El radio más estrecho usado entre burbujas agrupadas. |
--bubble-accent | Color de los iconos dentro del contenido. Lo define destructive. |
| Prop | Tipo | Predeterminado |
|---|---|---|
renderRenderiza un <button> o <a> para hacerlo interactivo. | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="bubble-content" | Selecciona la superficie de la burbuja en CSS. |
| Prop | Tipo | Predeterminado |
|---|---|---|
shapeSe aplica a todas las burbujas dentro del grupo. | "uniform" | "joined" | "tail" | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="bubble-group" | Apunta a los grupos en CSS. |
data-shape | La forma del grupo, cuando está definida. |
| Prop | Tipo | Predeterminado |
|---|---|---|
side | "top" | "bottom" | "bottom" |
align | "start" | "end" | "end" |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="bubble-reactions" | Selecciona las filas de reacciones en CSS. |
data-side | El lado actual. |
data-align | La alineación actual. |
- AttachmentTarjetas de archivos e imágenes para subidas, con progreso, estados, acciones, un trigger de tarjeta completa y nombres que conservan su extensión.
- MarkerNotas discretas entre el contenido, como separadores de fecha y eventos del sistema, con fechas y horas fijas que se leen como Hoy o Ayer.
- MessageUna fila de mensaje de chat con avatar, nombre, burbujas y estado, donde los mensajes nuevos suben desde el lado del remitente.
- Message scrollerUn área de desplazamiento de chat que sigue los mensajes nuevos, conserva tu posición mientras lees mensajes anteriores y cuenta lo que te perdiste en el botón de salto.
Usado en bloques
Bloques que se construyen sobre Bubble.
- Prompt InputUn compositor de chat que empieza como una línea tranquila, crece hasta convertirse en una tarjeta mientras escribes y baja cuando empieza la conversación. Enter envía, de forma segura con entrada en japonés y chino. Pega, suelta o elige archivos con vistas previas, progreso y reintento. @ añade archivos y / ejecuta comandos desde un menú junto al cursor. Un selector de modelo con teclas numéricas, un control deslizante de esfuerzo que cobra vida en Max, un anillo de contexto, dictado con forma de onda en vivo, chips de herramientas, una cola para los mensajes escritos mientras se transmite una respuesta y borradores que sobreviven a una recarga.
- Agent TodosMuestra el plan de un agente mientras trabaja. Cada paso pasa de pendiente a por hacer, en curso y hecho, con tiempos en vivo, fallos y las llamadas a herramientas detrás. Una píldora de estado para sobre el compositor, cambios del plan que puedes ver y un paso de revisión para editar el plan antes de ejecutarlo.
- Chat SidebarLa barra lateral de una app de chat. Logo, búsqueda y Nuevo chat arriba, tus propios enlaces debajo, chats fijados, proyectos que se expanden para mostrar sus chats, recientes agrupados por día y filas con menús al pasar el cursor y con clic derecho, renombrado en línea, eliminación con deshacer y estados de respuesta en vivo.
- Chat ThreadToda la conversación alrededor del compositor. Tu pregunta se fija arriba mientras la respuesta llega en streaming, los puntos de control del lateral saltan entre mensajes, y cada respuesta se puede copiar, editar, reintentar, valorar y cambiar entre versiones. Las respuestas renderizan Markdown con bloques de código, tablas y citas, y el razonamiento, las llamadas a herramientas y Prompt Input encajan directamente.