03 · Components

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).

Variantes soft (default)
Neutral Destacado Activo Borrador Crítico Nuevo
Variantes solid
Neutral Destacado Activo Borrador Crítico Nuevo
Tamañossm (16) · md (18, default) · lg (22)
Small Medium Large
Count y dotVariantes especiales
3 12 99+
<Badge variant="success">Activo</Badge>
<Badge variant="danger" solid>Crítico</Badge>
<Badge variant="accent" count>12</Badge>
<Badge variant="success" dot />
PropTipoDefaultDescripción
variant'neutral' | 'accent' | 'success' | 'warning' | 'danger' | 'info''neutral'Color semántico.
solidbooleanfalseFondo sólido en vez de soft.
size'sm' | 'md' | 'lg''md'Tamaño del badge.
countbooleanfalseForma circular para números.
dotbooleanfalsePunto de 8px sin texto.
childrenReactNode—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.

Variantes semánticas
Publicado Borrador Archivado En revisión Destacado Sin estado
Tamañossm (18) · md (22, default) · lg (26)
Publicado Publicado Publicado
Uso en contexto
Camiseta algodón orgánico Publicado
Pantalón chino slim fit Borrador
Sudadera descatalogada 2022 Archivado
<Pill variant="success">Publicado</Pill>
<Pill variant="warning" size="sm">Borrador</Pill>
PropTipoDefaultDescripción
variant'neutral' | 'accent' | 'success' | 'warning' | 'danger' | 'info''neutral'Color semántico.
size'sm' | 'md' | 'lg''md'Tamaño de la pill.
childrenReactNode—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.

Variantes
Nueva función disponible
Ya puedes exportar catálogos directamente a PDF desde la ficha del cliente.
Cambios guardados correctamente
Los 24 artículos se han sincronizado con el catálogo público.
Hay cambios sin guardar
Si sales ahora perderás las modificaciones de los últimos 4 artículos.
No se pudo conectar con el servidor
Revisa tu conexión e inténtalo de nuevo. Si el problema persiste, contacta con soporte.
Versión de solo lectura
Este catálogo está en modo archivo. Duplícalo para poder editarlo.
<Alert variant="warning" title="Hay cambios sin guardar" closable>
  Si sales ahora perderás las modificaciones.
</Alert>
PropTipoDefaultDescripción
variant'info' | 'success' | 'warning' | 'danger' | 'neutral''info'Color semántico.
titlestring—Título del alert.
iconReactNode | falseautoIcono custom o false para ocultar.
closablebooleanfalseMuestra botón de cierre.
onClose() => void—Handler de cierre.
childrenReactNode—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.

Variantes
Artículo guardado
«Camiseta algodón orgánico» se ha publicado.
Sincronización parcial
3 de 24 artículos no se actualizaron. Revísalos.
No se pudo eliminar
El artículo está referenciado en un catálogo activo.
Exportación en curso
Te avisaremos cuando el PDF esté listo.
// 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)TipoDefaultDescripción
titlestring—Primer argumento, título del toast.
options.descriptionstring—Línea secundaria.
options.durationnumber5000Ms antes de auto-cerrar. 0 = no cierra.
options.actions{ label, onClick }[]—Hasta 2 acciones inline.
options.closablebooleantrueMuestra botón de cierre.
<Toaster />
position'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top-center''bottom-right'Esquina de aparición.
maxnumber5Má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).

Valores
Subiendo imágenes25%
Exportando PDF62%
Sincronización100%
Estadosen progreso (naranja) · finalizado · error
Indeterminado
<Progress value={62} />
<Progress value={100} variant="success" />
<Progress indeterminate />
PropTipoDefaultDescripción
valuenumber (0–100)0Porcentaje completado.
indeterminatebooleanfalseAnimación sin valor concreto.
variant'progress' | 'success' | 'danger''progress'Estado: en progreso (naranja) · finalizado (success) · error (danger).
labelstring—Etiqueta encima de la barra.
showValuebooleanfalseMuestra 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.

Tamañossm (16) · md (24, default) · lg (32)
Coloresaccent (sin fondo) · white (sobre leading)
Con label
Cargando catálogos…
<Spinner />
<Spinner size="sm" />
<Spinner color="white" />  // sobre fondo leading
PropTipoDefaultDescripción
size'sm' | 'md' | 'lg''md'16 / 24 / 32 px.
color'accent' | 'white''accent'accent sin fondo · white sobre pastilla leading.
labelstring—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.

Primitivas
Card de artículoEjemplo compuesto
<Skeleton variant="title" width="60%" />
<Skeleton variant="text" lines={3} />
<Skeleton variant="circle" size={40} />
<Skeleton variant="rect" width={56} height={56} />
PropTipoDefaultDescripción
variant'text' | 'title' | 'circle' | 'rect''text'Forma del placeholder.
widthstring | number'100%'Ancho (px o %).
heightstring | numberautoAlto (px o %). Ignorado si variant text/title.
linesnumber1Solo variant 'text': repite líneas con ancho decreciente.
sizenumber40Solo 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.

Sin resultados de búsqueda

No encontramos artículos

Prueba con otros términos, quita los filtros aplicados o crea un artículo nuevo desde cero.

Colección vacía (first run)

Aún no hay catálogos

Crea tu primer catálogo a partir de una plantilla o importa desde CSV para empezar.

Error de carga

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>
  ]}
/>
PropTipoDefaultDescripción
iconReactNode—Icono superior (64×64 contenedor).
tone'neutral' | 'accent' | 'danger''neutral'Color del círculo del icono.
titlestring—Título principal.
descriptionstring—Descripción de la situación.
actionsReactNode[]—Array de acciones (1–2 botones).