Saltar al contenido
Índice de Kit UI
Kit UI Componentes

Estado vacío.

Patrón canónico de estado vacío para todos los consumidores.

Verlo por niveles

Primero el componente, después la variación de marca y finalmente su uso dentro de una página.

Nivel 1Componente canónico

Todavía no hay documentos

Crea el primero para iniciar el flujo de revisión.

Nivel 3Dentro de una página
Sitio · sección

Todavía no hay documentos

Crea el primero para iniciar el flujo de revisión.

Ver y copiar el código de este render
HTML del nivel canónico
<section class="ui-sample ui-feedback ui-state" data-empty-state><svg class="ui-state__icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M4 6h16v12H4zM8 10h8M8 14h5"></path></svg><div><h3>Todavía no hay documentos</h3><p>Crea el primero para iniciar el flujo de revisión.</p><div class="ui-actions"><a class="btn btn--primary" href="#accion">Crear documento</a></div></div></section>

Variaciones por marca y sitio

Cada cambio visible declara su autoridad; lo que permanece canónico no se vuelve a inventar en el producto.

innovacionsantiago.cl

Compañía de Innovación de Santiago

Autoridad: CONSTITUTION.md + LOGOS-CANONICOS.md

Todavía no hay documentos

Crea el primero para iniciar el flujo de revisión.

Cambia en esta marca

  • Navegación y contenido propios del servicio
  • Acento reservado para acciones y datos

Permanece canónico

  • Mark CIS y namebrand de tres líneas
  • IBM Plex Sans, foco, espaciado y anatomía
cochid.cl

COCHID

Autoridad: core-style/DECISIONES.md M15 y LOGOS-CANONICOS.md

No hay resultados

Quita filtros o prueba otra búsqueda.

Cambia en esta marca

  • Cuadrado azul y namebrand de tres líneas
  • Azul COCHID en selección, capas y series

Permanece canónico

  • Estructura y semántica comunes
  • Fuentes, unidades y alternativa tabular

Comparación histórica recuperable

Compara la propuesta con cortes reales del repositorio. La ausencia de una muestra se declara y nunca se reconstruye de memoria.

Estado actual
Estado vacío no tiene una implementación vigente demostrada; sus ejemplos son material candidato.
Cambio propuesto
Publicar en r19 el contrato de Estado vacío para Patrón canónico de estado vacío para todos los consumidores.
Qué ocurre si respondes No
Estado vacío queda fuera de r19 y sus ejemplos siguen sólo como evidencia pendiente de reformulación.

Preparando comparación histórica…

Antes / r19

La comparación convierte una regla abstracta en una diferencia visible y verificable.

r19 · correctoContrato canónico renderizado

Todavía no hay documentos

Crea el primero para iniciar el flujo de revisión.

  • Usa HTML semántico, foco visible y estados explícitos.
  • Conserva contenido útil a 320 px y sin JavaScript.
Antes · problema observadoAnti-ejemplo no interactivo
EN LÍNEATodo funciona correctamenteSin señal, hora ni servicio asociado
  • No agregues sombras, radios ni franjas laterales decorativas.
  • No uses color, placeholder o icono como única explicación.

Responsive

La misma anatomía debe conservar lectura, foco y acciones sin cortar contenido ni crear scroll horizontal en la página.

320 pxMóvil y zoom

Todavía no hay documentos

Crea el primero para iniciar el flujo de revisión.

1280 pxEscritorio

No hay resultados

Quita filtros o prueba otra búsqueda.

Cobertura

DimensiónContrato
Propietario canónicoSistema de diseño CIS · core/core-style
ConsumidoresTodos los consumidores
DependenciasHTML nativo, ARIA sólo cuando aporta
Estadocandidato

Evidencia de adopción

Patrón propuesto. 0 implementaciones observadas en 0 repositorios.

La observación demuestra uso existente; la aceptación canónica sigue dependiendo de esta ficha y de su propietario.

DatoResultado
ClasificaciónPatrón propuesto
Implementaciones0 implementaciones observadas
RepositoriosNingún repositorio observado
Snapshotkit/componentes/componentes-observados.json

Consumidores observados

El inventario conserva repositorio, archivo fuente y criterio de asociación. Observar una implementación no la convierte automáticamente en canónica.

Estados

Estado requerido
información
advertencia
error
éxito

Accesibilidad

  • Conserva nombre accesible, orden de lectura y foco visible.
  • Funciona a 320 px, con zoom de 200% y texto largo.
  • El color nunca es la única señal de estado o acción.
  • El contenido esencial permanece disponible sin JavaScript.

Código HTML

Copia el bloque completo; después cambia contenido y destinos, no su anatomía.

Código de referencia
<section class="ui-sample ui-feedback ui-state" data-empty-state><svg class="ui-state__icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M4 6h16v12H4zM8 10h8M8 14h5"></path></svg><div><h3>Todavía no hay documentos</h3><p>Crea el primero para iniciar el flujo de revisión.</p><div class="ui-actions"><a class="btn btn--primary" href="#accion">Crear documento</a></div></div></section>

Código TAILWIND

Copia el bloque completo; después cambia contenido y destinos, no su anatomía.

Código de referencia
<section class="ui-sample ui-feedback ui-state border border-slate-300 bg-white p-4 text-slate-950 grid gap-3" data-empty-state><svg class="ui-state__icon h-auto w-full" viewBox="0 0 24 24" aria-hidden="true"><path d="M4 6h16v12H4zM8 10h8M8 14h5"></path></svg><div><h3>Todavía no hay documentos</h3><p>Crea el primero para iniciar el flujo de revisión.</p><div class="ui-actions"><a class="btn btn--primary underline underline-offset-4" href="#accion">Crear documento</a></div></div></section>

Código REACT

Copia el bloque completo; después cambia contenido y destinos, no su anatomía.

Código de referencia
import type { MouseEventHandler } from "react";

export interface EmptyStateAction {
  /** Texto de la acción; vacío la omite. */
  label: string;
  /** Con `href` la acción es un enlace; sin él, un botón. */
  href?: string;
  /** `primary` para la acción principal (una por vista); `quiet` para una salida secundaria. Por defecto, `secondary`. */
  tone?: "primary" | "secondary" | "quiet";
  /** Se llama al activar la acción; en un enlace, antes de navegar. */
  onClick?: MouseEventHandler<HTMLElement>;
}

export interface EmptyStateProps {
  /** Qué falta, dicho en concreto («Todavía no hay documentos»). */
  title?: string;
  /** Qué hacer para que aparezca contenido. */
  description?: string;
  /** Acciones bajo el texto; una lista vacía no emite la fila y una acción sin texto se omite. */
  actions?: EmptyStateAction[];
  className?: string;
}

const ACCIONES: EmptyStateAction[] = [
  { label: "Crear documento", href: "#accion", tone: "primary" },
];

/**
 * Estado vacío de una lista, tabla o búsqueda sin elementos, con el motivo y las acciones para crear el primero o salir del filtro.
 *
 * Para una lista que nunca tuvo elementos, una acción `primary` que crea el primero; para una búsqueda sin resultados, acciones que quitan filtros.
 *
 * @example <EmptyState />
 * @example <EmptyState title="No hay resultados" description="Quita filtros o prueba otra búsqueda." actions={[{ label: "Limpiar filtros", onClick: limpiar }, { label: "Ver todos", href: "/documentos", tone: "quiet" }]} />
 */
export function EmptyState({
  title = "Todavía no hay documentos",
  description = "Crea el primero para iniciar el flujo de revisión.",
  actions = ACCIONES,
  className,
}: EmptyStateProps) {
  const visibles = actions.filter((accion) => accion.label);
  return (
    <section className={["ui-feedback ui-state", className].filter(Boolean).join(" ")} data-empty-state>
      <svg className="ui-state__icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M4 6h16v12H4zM8 10h8M8 14h5"></path></svg>
      <div>
        {title ? <h3>{title}</h3> : null}
        {description ? <p>{description}</p> : null}
        {visibles.length ? (
          <div className="ui-actions">
            {visibles.map((accion, indice) => {
              const clase = `btn btn--${accion.tone ?? "secondary"}`;
              return accion.href !== undefined ? (
                <a className={clase} href={accion.href} onClick={accion.onClick} key={`${accion.label}-${indice}`}>{accion.label}</a>
              ) : (
                <button className={clase} type="button" onClick={accion.onClick} key={`${accion.label}-${indice}`}>{accion.label}</button>
              );
            })}
          </div>
        ) : null}
      </div>
    </section>
  );
}