Badge y Chip
BetaBadge etiqueta e informa. Chip navega o marca un estado. Ninguno de los dos reemplaza a un botón.
registry/ds/badge.tsximport { Badge } from "@/registry/ds/badge";
export default function BadgeBasic() {
return (
<div className="flex flex-wrap items-center gap-3">
<Badge variant="fill">Nuevo</Badge>
<Badge variant="tonal">Beca 50%</Badge>
<Badge variant="stroke">Electiva</Badge>
</div>
);
}La regla de tres
| Componente | Hace | ¿Clickeable? |
|---|---|---|
| Badge | Informa: categoría, novedad, atributo. | No. |
| Chip | Navega a algo relacionado, o marca un estado. | Link: sí. Status: no. |
| Button | Actúa. | Sí. |
Badge
Tres estilos, de más a menos énfasis. Tonal es el default; Fill, uno por zona como mucho.
import { Badge } from "@/registry/ds/badge";
import { ArrowUpRight, Close } from "@/registry/ds/icons";
export default function BadgeSizes() {
return (
<div className="flex flex-col items-center gap-4">
<div className="flex flex-wrap items-center gap-3">
<Badge size="sm">Small</Badge>
<Badge size="md">Medium</Badge>
<Badge size="lg">Large</Badge>
</div>
<div className="flex flex-wrap items-center gap-3">
<Badge radius="semi">Semi</Badge>
<Badge radius="semi" iconRight={<ArrowUpRight />}>Con icono</Badge>
<Badge radius="semi" iconOnly={<Close />} aria-label="Rechazado" />
<Badge iconOnly={<Close />} aria-label="Rechazado" />
</div>
</div>
);
}Chip · Link
Un link con forma de etiqueta: más presencia que un link de texto, menos que un botón. Para categorías, temas, filtros que llevan a otra vista.
import { Chip } from "@/registry/ds/badge";
import { ArrowUpRight } from "@/registry/ds/icons";
export default function ChipBasic() {
return (
<div className="flex flex-wrap items-center gap-3">
<Chip href="#" iconRight={<ArrowUpRight />}>Ingeniería</Chip>
<Chip href="#" iconRight={<ArrowUpRight />}>Diseño</Chip>
<Chip href="#" radius="semi">Ver todas</Chip>
</div>
);
}Chip · Status
El estado de algo: un pago, una solicitud, una cuenta. El punto acompaña al color para que no dependa solo de él.
import { Chip } from "@/registry/ds/badge";
export default function ChipStatus() {
return (
<div className="flex flex-wrap items-center gap-3">
<Chip status="success">Activo</Chip>
<Chip status="warning">Pendiente</Chip>
<Chip status="danger">Rechazado</Chip>
</div>
);
}Badge Group
Un mensaje de una línea con un Badge adentro, como link: anuncios arriba de un hero o una lista ("Nuevo · Inscripciones abiertas →"). Uno por vista.
import { BadgeGroup } from "@/registry/ds/badge";
import { ArrowUpRight } from "@/registry/ds/icons";
export default function BadgeGroupExample() {
return (
<div className="flex flex-col items-center gap-4">
<BadgeGroup badge="Nuevo" href="#" iconRight={<ArrowUpRight />}>Inscripciones abiertas para 2027</BadgeGroup>
<BadgeGroup badge="Beta" variant="stroke" position="right" size="sm" radius="semi">Campus virtual renovado</BadgeGroup>
</div>
);
}Contenido
- Una o dos palabras. Un badge con una oración es un Alert.
- Mayúscula inicial, sin punto.
- Status: usá siempre las mismas palabras para el mismo estado en todo el producto.
- El radio acompaña al de los botones de la página: Full con Full, Semi con Semi.
Medidas
| Size | Alto | Padding X | Texto | Icono |
|---|---|---|---|---|
sm | 20 | spacing-md 8 | Text xs / Medium | 12 |
md | 24 | spacing-lg 10 | Text xs / Medium | 12 |
lg | 28 | spacing-xl 12 | Text sm / Medium | 14 |
Radio radius-full o radius-sm (6). Icon only: cuadrado del alto. Punto de
status: 6.
Tokens
| Parte | Propiedad | Token |
|---|---|---|
| Badge Fill | Fondo / texto | primary/solid |
| Badge Tonal | Fondo | primary/subtle |
| Badge Tonal | Borde | primary/border |
| Badge Tonal | Texto | primary/text |
| Badge Stroke | Borde y texto | primary/accent |
| Badge Stroke | Fondo | bg/elevated |
| Chip Link | Fondo | bg/elevated |
| Chip Link | Borde | border/default |
| Chip Link · hover | Fondo / borde | bg/subtle |
| Chip Link | Texto | text/default |
| Chip Status | Fondo | success/subtle |
| Chip Status | Texto | success/text |
| Chip Status | Punto | success/solid |
En Figma
| Propiedad en Figma | Valores | En código | Nota |
|---|---|---|---|
| Badge › Style | Fill · Tonal · Stroke | variant | — |
| Size · Radius | sm · md · lg · Full · Semi | size · radius | — |
| Badge › Type | Default · Icon only | iconOnly | — |
| Icon left / right (+ swap) | on/off · icono | iconLeft · iconRight | — |
| Chip › Type | Link · Status | href / onClick · status | — |
| Chip › Color | Success · Warning · Error | status="success | warning | danger" | — |
| Badge Group › Position · Style · Size | Badge left / right · Tonal / Stroke · sm / md | position · variant · size | — |
| Badge Group › Message | Texto | children · badge | — |
Instalación
npx shadcn@latest add https://polen.cdc.cool/r/badge.jsonPlayground
Configurá el componente y copiá el snippet: se genera del mismo estado que renderiza el preview.
<Badge>Beca 50%</Badge>Props de Badge
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
variant | "fill" | "tonal" | "stroke" | "tonal" | Énfasis. |
size | "sm" | "md" | "lg" | "md" | Alto 20 / 24 / 28. |
radius | "full" | "semi" | "full" | Acompaña al radio de los botones de la página. |
iconLeft · iconRight | ReactNode | — | Iconos decorativos. |
iconOnly | ReactNode | — | Solo icono. Requiere aria-label. |
Props de Badge Group
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
badge | ReactNode | — | Texto del badge interior. Requerido. |
children | ReactNode | — | El mensaje. |
variant · size · radius | "tonal" | "stroke" · "sm" | "md" · "full" | "semi" | "tonal" · "md" · "full" | Estilo, alto 28 / 32 y forma. |
position | "left" | "right" | "left" | Dónde va el badge. |
href · iconRight | string · ReactNode | — | Lo vuelve un link; flecha opcional. |
Playground de Chip
Configurá el componente y copiá el snippet: se genera del mismo estado que renderiza el preview.
<Chip status="success">Con cupo</Chip>Props de Chip
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
status | "success" | "warning" | "danger" | — | Lo vuelve un indicador de estado, no interactivo. |
href | string | — | Renderiza un <a>. Sin href ni status, es un <button>. |
size · radius | — | — | Igual que Badge. |
iconLeft · iconRight | ReactNode | — | Solo en el tipo link. |
- Badge es texto: se lee en el orden del contenido. Si solo tiene icono,
necesita
aria-label(se expone como imagen). - Chip link es un
<a>o<button>real, con foco visible y alto mínimo de 20: si el chipsmes el único target de una zona táctil, usámdolg. - Chip status no depende del color: lleva punto y, sobre todo, la palabra.
- Si un badge cambia en vivo (un contador), anunciá el cambio desde el
contenedor con
aria-live, no desde el badge.