Feedback
Comunicación de estado al usuario: Badge, Pill, Alert, Toast, Progress, Spinner, Skeleton, Empty state. Todos usan la paleta semántica (success, warning, danger, info, neutral).
Badge
<Badge />Etiqueta corta para marcar estados, categorías o conteos. Por defecto en variante soft (fondo tintado + texto oscuro); variante solid cuando se necesita mayor contraste (sobre imágenes, tarjetas oscuras).
<Badge variant="success">Activo</Badge>
<Badge variant="danger" solid>Crítico</Badge>
<Badge variant="accent" count>12</Badge>
<Badge variant="success" dot />
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| variant | 'neutral' | 'accent' | 'success' | 'warning' | 'danger' | 'info' | 'neutral' | Color semántico. |
| solid | boolean | false | Fondo sólido en vez de soft. |
| size | 'sm' | 'md' | 'lg' | 'md' | Tamaño del badge. |
| count | boolean | false | Forma circular para números. |
| dot | boolean | false | Punto de 8px sin texto. |
| children | ReactNode | — | Contenido (ignorado si dot). |
Pill
<Pill />Indicador de estado con semáforo de color integrado (dot delante). Se usa en tablas, headers de entidad y listas para comunicar el estado de un registro a golpe de vista.
<Pill variant="success">Publicado</Pill>
<Pill variant="warning" size="sm">Borrador</Pill>
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| variant | 'neutral' | 'accent' | 'success' | 'warning' | 'danger' | 'info' | 'neutral' | Color semántico. |
| size | 'sm' | 'md' | 'lg' | 'md' | Tamaño de la pill. |
| children | ReactNode | — | Etiqueta del estado. |
Alert
<Alert />Mensaje informativo inline, embebido en el flujo de la página. Para notificaciones no intrusivas usar Toast; para bloqueos usar Modal.
<Alert variant="warning" title="Hay cambios sin guardar" closable>
Si sales ahora perderás las modificaciones.
</Alert>
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| variant | 'info' | 'success' | 'warning' | 'danger' | 'neutral' | 'info' | Color semántico. |
| title | string | — | Título del alert. |
| icon | ReactNode | false | auto | Icono custom o false para ocultar. |
| closable | boolean | false | Muestra botón de cierre. |
| onClose | () => void | — | Handler de cierre. |
| children | ReactNode | — | Descripción / contenido. |
Toast
<Toast /> · toast()Notificación flotante que aparece en la esquina (por defecto bottom-right), auto-desaparece a los 5s y puede apilarse. Se dispara imperativamente con la función toast(), no se renderiza en JSX salvo para el <Toaster /> provider.
// 1. Añadir el Toaster una vez en el root de la app
<Toaster position="bottom-right" />
// 2. Disparar toasts imperativamente
toast.success("Artículo guardado", { description: "Se ha publicado." });
toast.error("No se pudo eliminar");
toast.warning("Sincronización parcial", {
description: "3 de 24 no se actualizaron.",
actions: [
{ label: "Ver detalle", onClick: openDetail },
{ label: "Reintentar", onClick: retry },
]
});
toast.info("Exportación en curso", { duration: 0 });
| toast.X(title, options) | Tipo | Default | Descripción |
|---|---|---|---|
| title | string | — | Primer argumento, título del toast. |
| options.description | string | — | Línea secundaria. |
| options.duration | number | 5000 | Ms antes de auto-cerrar. 0 = no cierra. |
| options.actions | { label, onClick }[] | — | Hasta 2 acciones inline. |
| options.closable | boolean | true | Muestra botón de cierre. |
| <Toaster /> | |||
| position | 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top-center' | 'bottom-right' | Esquina de aparición. |
| max | number | 5 | Máximo de toasts visibles simultáneamente. |
Progress
<Progress />Barra de progreso lineal. Usa value determinado (0–100) para operaciones medibles; indeterminate para procesos sin cuantificar (cargando datos, guardando).
<Progress value={62} />
<Progress value={100} variant="success" />
<Progress indeterminate />
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| value | number (0–100) | 0 | Porcentaje completado. |
| indeterminate | boolean | false | Animación sin valor concreto. |
| variant | 'progress' | 'success' | 'danger' | 'progress' | Estado: en progreso (naranja) · finalizado (success) · error (danger). |
| label | string | — | Etiqueta encima de la barra. |
| showValue | boolean | false | Muestra el % al lado del label. |
Spinner
<Spinner />Indicador circular de carga. Para cargas dentro de botones usar <Button loading />; para áreas de contenido mayores, combinar con overlay o usar Skeleton.
<Spinner />
<Spinner size="sm" />
<Spinner color="white" /> // sobre fondo leading
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| size | 'sm' | 'md' | 'lg' | 'md' | 16 / 24 / 32 px. |
| color | 'accent' | 'white' | 'accent' | accent sin fondo · white sobre pastilla leading. |
| label | string | — | Texto accesible (sr-only). |
Skeleton
<Skeleton />Placeholder animado que reproduce la silueta del contenido real mientras se carga. Preferible al spinner para listas y cards: reduce la percepción de espera y mantiene la estabilidad del layout.
<Skeleton variant="title" width="60%" />
<Skeleton variant="text" lines={3} />
<Skeleton variant="circle" size={40} />
<Skeleton variant="rect" width={56} height={56} />
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| variant | 'text' | 'title' | 'circle' | 'rect' | 'text' | Forma del placeholder. |
| width | string | number | '100%' | Ancho (px o %). |
| height | string | number | auto | Alto (px o %). Ignorado si variant text/title. |
| lines | number | 1 | Solo variant 'text': repite líneas con ancho decreciente. |
| size | number | 40 | Solo variant 'circle': diámetro. |
Empty state
<Empty />Pantalla de contenido vacío. Obligatorio incluir al menos una acción primaria que desbloquee al usuario (crear, importar, invitar). Nunca mostrar solo el mensaje.
No encontramos artículos
Prueba con otros términos, quita los filtros aplicados o crea un artículo nuevo desde cero.
Aún no hay catálogos
Crea tu primer catálogo a partir de una plantilla o importa desde CSV para empezar.
No pudimos cargar los datos
Hubo un problema de conexión. Reintenta o contacta con soporte si el problema persiste.
<Empty
icon={<IconSearch />}
title="No encontramos artículos"
description="Prueba con otros términos o quita los filtros."
actions={[
<Button variant="secondary">Quitar filtros</Button>,
<Button variant="primary">Nuevo artículo</Button>
]}
/>
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| icon | ReactNode | — | Icono superior (64×64 contenedor). |
| tone | 'neutral' | 'accent' | 'danger' | 'neutral' | Color del círculo del icono. |
| title | string | — | Título principal. |
| description | string | — | Descripción de la situación. |
| actions | ReactNode[] | — | Array de acciones (1–2 botones). |