No hay resultados
Prueba otra búsqueda o quita los filtros.
Estado de vista vacío, carga o error, con explicación visible y salida controlada por el consumidor.
Primero el componente, después la variación de marca y finalmente su uso dentro de una página.
Prueba otra búsqueda o quita los filtros.
Conservamos la vista anterior mientras esperamos.
Prueba otra búsqueda o quita los filtros.
<section class="ui-sample ui-feedback ui-state" data-ui-state="empty" role="status" aria-live="polite"><h3>No hay resultados</h3><p>Prueba otra búsqueda o quita los filtros.</p></section>Cada cambio visible declara su autoridad; lo que permanece canónico no se vuelve a inventar en el producto.
Prueba otra búsqueda o quita los filtros.
Conservamos la vista anterior mientras esperamos.
Cada estado conserva una explicación visible y una salida. Los ejemplos no ejecutan consultas.
Prueba otra búsqueda o quita los filtros.
Conservamos la vista anterior mientras esperamos.
Conservamos la vista anterior; puedes volver a intentar.
Compara la propuesta con cortes reales del repositorio. La ausencia de una muestra se declara y nunca se reconstruye de memoria.
Preparando comparación histórica…
La comparación convierte una regla abstracta en una diferencia visible y verificable.
Prueba otra búsqueda o quita los filtros.
La misma anatomía debe conservar lectura, foco y acciones sin cortar contenido ni crear scroll horizontal en la página.
Prueba otra búsqueda o quita los filtros.
Conservamos la vista anterior mientras esperamos.
| Dimensión | Contrato |
|---|---|
| Propietario canónico | Sistema de diseño CIS · core/core-style |
| Consumidores | Todos los consumidores |
| Dependencias | HTML nativo, ARIA sólo cuando aporta |
| Estado | componente |
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.
| Dato | Resultado |
|---|---|
| Clasificación | Patrón propuesto |
| Implementaciones | 0 implementaciones observadas |
| Repositorios | Ningún repositorio observado |
| Snapshot | kit/componentes/componentes-observados.json |
El inventario conserva repositorio, archivo fuente y criterio de asociación. Observar una implementación no la convierte automáticamente en canónica.
| Estado requerido |
|---|
| vacío |
| carga |
| error |
Copia el bloque completo; después cambia contenido y destinos, no su anatomía.
<section class="ui-sample ui-feedback ui-state" data-ui-state="empty" role="status" aria-live="polite"><h3>No hay resultados</h3><p>Prueba otra búsqueda o quita los filtros.</p></section>Copia el bloque completo; después cambia contenido y destinos, no su anatomía.
<section class="ui-sample ui-feedback ui-state border border-slate-300 bg-white p-4 text-slate-950 grid gap-3" data-ui-state="empty" role="status" aria-live="polite"><h3>No hay resultados</h3><p>Prueba otra búsqueda o quita los filtros.</p></section>Copia el bloque completo; después cambia contenido y destinos, no su anatomía.
import type { MouseEventHandler } from 'react';
export interface UiStateProps {
state?: 'empty' | 'loading' | 'error';
title?: string;
description?: string;
action?: { label: string; href?: string; onClick?: MouseEventHandler<HTMLElement> };
className?: string;
}
/** Estado de una vista, con explicación y salida. El consumidor controla la operación. */
export function UiState({state='empty',title,description,action,className}:UiStateProps){
const labels={empty:['No hay resultados','Prueba otra búsqueda o quita los filtros.'],loading:['Cargando resultados','Conservamos la vista anterior mientras esperamos.'],error:['No pudimos cargar los resultados','Conservamos la última versión disponible.']};
return <section className={['ui-feedback ui-state',className].filter(Boolean).join(' ')} data-ui-state={state} role={state==='error'?'alert':'status'} aria-live={state==='error'?'assertive':'polite'} aria-busy={state==='loading'?true:undefined}>
<h3>{title??labels[state][0]}</h3>
<p>{description??labels[state][1]}</p>
{action?.label?<div className="ui-actions">{action.href!==undefined?<a className="btn btn--secondary" href={action.href} onClick={action.onClick}>{action.label}</a>:<button className="btn btn--secondary" type="button" onClick={action.onClick}>{action.label}</button>}</div>:null}
</section>;
}