Badge
Etiquetas de estado con puntos de color, tags eliminables que se deslizan al cerrarse y contadores que ruedan hasta su nuevo valor.
pnpm dlx shadcn@latest add https://hextaui.com/r/badge.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 @tabler/icons-react class-variance-authority cnCopia y pega el siguiente código en tu proyecto.
components/ui/badge.tsx components/ui/number-flow.tsx lib/motion.ts Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
Variantes y apariencias
La apariencia outline por defecto mantiene una superficie neutra y pone el color de estado en el punto o el icono. Usa appearance="solid" cuando la insignia deba destacar, o appearance="muted" para un chip relleno discreto. shape="pill" la redondea por completo.
Tamaños
sm, default y lg. Los iconos, puntos, el botón de cierre y los contadores escalan con la insignia.
Removible
Añade un <BadgeClose /> para que una insignia se pueda quitar. Se encoge hasta cerrarse y sus vecinas se deslizan hacia el hueco; luego el foco pasa al siguiente botón de cierre. Quita el elemento de tus datos en onOpenChangeComplete para que la animación de salida termine antes.
Controlado
Pasa open y onOpenChange para controlar la visibilidad tú mismo. Volver a poner open en true recupera la insignia con una animación de entrada.
Contadores
<BadgeCount /> hace rodar solo los dígitos que cambian y se limita a max (99 por defecto) con un signo más. Los lectores de pantalla siempre oyen el número real.
Interactiva
Usa render para convertir una insignia en un enlace o un botón. Gana un tinte al pasar el cursor, una escala al pulsar y un anillo de foco. aria-invalid muestra el estado de error.
Contenido largo
Una insignia nunca crece más que su contenedor. Las etiquetas largas se truncan con puntos suspensivos mientras los iconos y el botón de cierre permanecen visibles.
De derecha a izquierda
Los iconos, el botón de cierre y la animación de colapso siguen la dirección de lectura. Los contadores siempre se leen de izquierda a derecha.
Estas teclas se aplican a <BadgeClose />.
| Key | Acción |
|---|---|
| EnterSpace | Quita la insignia. |
| BackspaceDelete | Quita la insignia. |
| Tab | Pasa al siguiente botón de cierre. Tras una eliminación, el foco va al siguiente botón de cierre, o al anterior si era el último. |
- El botón de cierre toma el nombre de la insignia, así que un lector de pantalla anuncia “Remove design” en lugar de un simple “Remove”. Pasa
aria-labelpara reemplazarlo. <BadgeDot />es decorativo y está oculto para las tecnologías de asistencia. Mantén el estado en la etiqueta de texto.<BadgeCount />expone el valor exacto incluso cuando el texto visible está limitado, como 99+.- Las animaciones de eliminación y de contador se omiten con movimiento reducido.
<Badge /> renderiza un <span> y acepta todos sus atributos.
| Prop | Tipo | Predeterminado |
|---|---|---|
variantColorea el punto y los iconos en outline, o la superficie en solid. | "default" | "success" | "info" | "warning" | "destructive" | "default" |
appearance | "outline" | "solid" | "muted" | "outline" |
shape | "default" | "pill" | "default" |
size | "sm" | "default" | "lg" | "default" |
openVisibilidad controlada. | boolean | – |
defaultOpen | boolean | true |
onOpenChangeSe llama cuando se activa BadgeClose. | (open: boolean) => void | – |
onOpenChangeCompleteSe llama cuando termina la animación de salida. Quita aquí el elemento de tus datos. | (open: boolean) => void | – |
render | ReactElement | (props, state) => ReactElement | <span> |
| Atributo | Descripción |
|---|---|
data-slot="badge" | Selecciona las insignias en CSS. |
data-variant | La variante actual. |
data-appearance | La apariencia actual. |
data-shape | La forma actual. |
data-size | El tamaño actual. |
data-ending-style | Presente mientras la insignia se anima al salir. |
--badge-accent | El color de estado usado por los puntos y los iconos. Reemplázalo para un acento personalizado. |
--badge-height | La altura de la insignia. |
--badge-radius | El radio de las esquinas. El botón de cierre deriva su propio radio de él. |
| Prop | Tipo | Predeterminado |
|---|---|---|
pulseAñade una animación ping para estados en vivo. Se desactiva con movimiento reducido. | boolean | false |
| Atributo | Descripción |
|---|---|
data-slot="badge-dot" | Selecciona los puntos en CSS. |
data-pulse | Presente cuando pulse está activado. |
| Prop | Tipo | Predeterminado |
|---|---|---|
children | ReactNode | <IconX /> |
aria-labelReemplaza el nombre automático “Remove {label}”. | string | – |
onClickLlama a event.preventDefault() para mantener la insignia abierta. | (event) => void | – |
| Atributo | Descripción |
|---|---|
data-slot="badge-close" | Selecciona el botón de cierre en CSS. |
| Prop | Tipo | Predeterminado |
|---|---|---|
valueLos valores negativos y no finitos muestran 0. | number | – |
maxLos valores por encima se muestran como max+. Pasa Infinity para no tener límite. | number | 99 |
duration | number | 600 |
animated | boolean | true |
trendLa dirección en que giran los dígitos. | "auto" | "up" | "down" | "shortest" | "auto" |
locales | Intl.LocalesArgument | – |
format | Intl.NumberFormatOptions | – |
| Atributo | Descripción |
|---|---|
data-slot="badge-count" | Selecciona los contadores en CSS. |
- MotionLas curvas de easing, duraciones y la comprobación de movimiento reducido con las que se anima cada componente, además de hooks para transformaciones de tamaño y resaltados deslizantes.
- Number flowNúmeros animados donde solo giran los dígitos que cambian, con cualquier formato Intl y configuración regional.
- AvatarFotos de usuario con iniciales como alternativa, insignias de estado y grupos apilados que se colapsan en un contador.
- CardUna superficie para agrupar contenido, con tres variantes, contenido multimedia de borde a borde, radios concéntricos y enlaces en toda la tarjeta.
- ChartGráficos de Recharts con colores del tema, un tooltip y una leyenda que leen las etiquetas de una sola configuración, y navegación con teclado con un anillo de foco visible.
- Data tableUna tabla para datos reales, con ordenación, búsqueda, selección de filas, columnas fijadas, un encabezado fijo y paginación.
Usado en bloques
Bloques que se construyen sobre Badge.
- API keysLa página de claves de API de un producto de IA, como las consolas de OpenAI y Anthropic. Crea claves con permisos acotados y caducidad, ve el secreto una sola vez con una copia que lo confirma, revoca con deshacer, renombra en el sitio, rota con un periodo de gracia y consulta el uso por clave.
- BillingPlan y uso para un producto de IA, al estilo de Cursor, Claude y Vercel. Un medidor de uso dividido por modelo que proyecta el final del ciclo y avisa antes de que se agoten los créditos, un gráfico diario por el que puedes desplazarte, un límite de gasto con alertas que puedes previsualizar en el medidor, cambios de plan con prorrateo exacto, un formulario de tarjeta con validación real y facturas descargables en PDF.
- Code BlockBloques de código pensados para respuestas de IA. Resaltado de sintaxis que sigue el ritmo del streaming, copiar, descargar y ajustar líneas, números de línea y líneas resaltadas, diffs con aceptar y rechazar, y una terminal para comandos.
- ModelsLa página Modelos de los ajustes de un producto de IA. Un modelo predeterminado con su contexto, velocidad y coste de un vistazo, un esfuerzo predeterminado que sabe qué admite cada modelo, una lista de modelos con búsqueda agrupada por proveedor con filtros, fijados e interruptores masivos, servidores compatibles con OpenAI con una prueba de conexión real y una actualización que te dice qué hay de nuevo.