Empty
Un marcador de posición para pantallas que aún no tienen nada que mostrar, con un icono, un mensaje y la siguiente acción.
pnpm dlx shadcn@latest add https://hextaui.com/r/empty.jsonAñade el componente, los tokens del tema de HextaUI y los componentes de HextaUI de los que depende.
Añade los tokens del tema a tu CSS global, si aún no lo has hecho.
Instala las dependencias.
pnpm add @base-ui/react class-variance-authority cnCopia y pega el siguiente código en tu proyecto.
components/ui/empty.tsx Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
Entrada
Cuando un estado vacío reemplaza contenido, sus partes aparecen con un fundido ascendente una tras otra: el elemento multimedia, el título, la descripción y luego las acciones. Descarta las notificaciones para verlo. Con movimiento reducido simplemente aparece. Define animated={false} para estados vacíos que están desde el primer renderizado.
Contorno
variant="outline" dibuja un borde fino discontinuo, la forma habitual de marcar una zona de soltado o un área que espera contenido.
Atenuado
variant="muted" se apoya en un relleno suave. El icono pasa a una superficie blanca elevada para que siga destacando.
Pequeño
size="sm" reduce el relleno, los gaps, el icono y el título para barras laterales, popovers y paneles estrechos.
Avatar
La variante EmptyMedia por defecto solo centra su contenido, así que cabe cualquier avatar, insignia o ilustración.
Grupo de avatares
Muestra quién podría estar aquí, para invitaciones y espacios compartidos.
Imagen
Dale a las imágenes dimensiones explícitas para que el diseño no se desplace mientras cargan.
Sin resultados de búsqueda
Cambia los resultados por un estado vacío cuando los filtros no coinciden con nada, y ofrece una salida. Un role="status" oculto visualmente anuncia el recuento, así que los usuarios de lectores de pantalla oyen el cambio sin que se lea toda la lista.
En una tarjeta
Usa size="sm" con la variante muted para llenar una tarjeta que todavía no tiene datos.
En una tabla
Ponlo en una sola celda que abarque todas las columnas con colSpan, para que el encabezado siga alineado.
En un popover
Un estado vacío compacto para menús y paneles de notificaciones.
En una lista de comandos
<CommandEmpty /> pasa la búsqueda actual a un hijo de tipo función, para que el mensaje pueda citarla.
Nivel de encabezado
El título es un <div> para que nunca rompa el esquema de tu página. Renderízalo con el nivel de encabezado que corresponda y etiqueta la región con él.
Contenido largo
Los nombres sin espacios y las direcciones largas se ajustan dentro del contenedor, y las etiquetas largas de botón se truncan.
De derecha a izquierda
Todo está centrado y usa propiedades lógicas, así que se lee con naturalidad en diseños de derecha a izquierda.
<EmptyTitle />renderiza un<div>. Pasarender={<h2 />}(o el nivel que corresponda) cuando el estado vacío sea una sección de la página.<EmptyMedia variant="icon" />está oculto para las tecnologías de asistencia porque el título ya dice lo que significa. Las imágenes en la variante por defecto siguen expuestas, así que dales unaltoalt="".- Cuando los resultados desaparecen tras una búsqueda o filtro, anuncia el cambio con un mensaje corto
role="status"junto a la lista. No conviertas todo el estado vacío en una región activa, ya que sus botones y enlaces se leerían cada vez.
Cada parte renderiza un elemento simple, acepta sus atributos y admite la prop render para cambiarlo.
| Prop | Tipo | Predeterminado |
|---|---|---|
variant | "default" | "outline" | "muted" | "default" |
sizesm reduce el relleno, los gaps, el icono y el título. | "default" | "sm" | "default" |
animatedHace aparecer las partes con un fundido ascendente en secuencia cuando se monta el estado vacío. Se omite con movimiento reducido. | boolean | true |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="empty" | Apunta a la raíz en CSS. |
data-variant | La variante actual. |
data-size | El tamaño actual. |
data-animated | Presente cuando la animación de entrada está activada. |
--empty-padding | Relleno en todos los lados. Lo define size. |
--empty-gap | Espacio entre el encabezado y el contenido. Lo define size. |
| Prop | Tipo | Predeterminado |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="empty-header" | Apunta al encabezado en CSS. |
| Prop | Tipo | Predeterminado |
|---|---|---|
varianticon coloca un icono en un mosaico atenuado. stack eleva el mosaico sobre dos tarjetas en abanico que se abren al pasar el cursor sobre el estado vacío. Ambos ocultan el elemento multimedia para las tecnologías de asistencia. | "default" | "icon" | "stack" | "default" |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="empty-icon" | Selecciona el elemento multimedia en CSS. Coincide con shadcn. |
data-variant | La variante actual. |
| Prop | Tipo | Predeterminado |
|---|---|---|
renderRenderiza un encabezado, como render={<h2 />}. | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="empty-title" | Apunta al título en CSS. |
| Prop | Tipo | Predeterminado |
|---|---|---|
renderLos enlaces simples dentro se subrayan. Los componentes renderizados como enlaces conservan su propio estilo. | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="empty-description" | Apunta a la descripción en CSS. |
| Prop | Tipo | Predeterminado |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="empty-content" | Selecciona el área de acciones en CSS. |
- AlertMensajes en línea para estado y comentarios, con una superficie neutra, un icono de color y un descarte que se colapsa con suavidad.
- ProgressUna barra o anillo que muestra cuánto ha avanzado una tarea, se suaviza entre actualizaciones y se desliza mientras el total es desconocido.
- SkeletonMarcadores de posición que esperan 150ms antes de mostrarse, toman el tamaño exacto del contenido que envuelven y lo hacen aparecer con un fundido sin mover nada.
- SpinnerUn indicador de carga con marcas al estilo Apple o un anillo que respira, que puede esperar antes de mostrarse y permanecer el tiempo suficiente para no parpadear.
- ToastMensajes breves que se apilan con orden, se expanden al pasar el cursor, se descartan deslizando y convierten un estado de carga en éxito o error en el mismo lugar.
Usado en bloques
Bloques que se construyen sobre Empty.
- API keysLa página de claves de API de un producto de IA, como las consolas de OpenAI y Anthropic. Crea claves con permisos acotados y caducidad, ve el secreto una sola vez con una copia que lo confirma, revoca con deshacer, renombra en el sitio, rota con un periodo de gracia y consulta el uso por clave.
- Diff ReviewRevisa las ediciones de un agente en todos los archivos antes de que se apliquen. Un árbol de archivos con contadores, aceptar o rechazar cada cambio, cada archivo o todo, comentarios en cualquier línea o rango que vuelven al agente, vistas unificada y dividida, resaltado a nivel de palabra, deshacer, ediciones en streaming y un resumen «Editados 4 archivos» para el chat.
- SecuritySesiones y seguridad para un producto de IA. Dispositivos activos con cierre de sesión que anima la salida de las filas, cambio de contraseña con un medidor de fortaleza en vivo, configuración de dos factores con un código QR real, una verificación de 6 dígitos y códigos de recuperación descargables, passkeys mediante WebAuthn y eliminación de la cuenta tras una confirmación escrita.
- SettingsAjustes para un producto de IA, con un diseño como el de Cursor y Claude. Una barra lateral rellena con búsqueda, grupos y enlaces externos, tarjetas de filas con selectores discretos y opciones anidadas, una isla de guardado oscura que sube solo cuando algo cambió, ⌘S para guardar, errores de campo desde tus comprobaciones o tu servidor y estados de carga con la forma del contenido.