Skeleton
Marcadores 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.
pnpm dlx shadcn@latest add https://hextaui.com/r/skeleton.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 cn tw-animate-cssCopia y pega el siguiente código en tu proyecto.
components/ui/skeleton.tsx Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
El shimmer y el pulso usan dos animaciones de tu tema. Añádelas una vez a tu archivo CSS global.
Usa un skeleton por sí solo como marcador de posición con tamaño, o pasa loading y envuelve el contenido real para que el marcador adopte su tamaño exacto.
Formas
Por sí solo, un skeleton es un bloque vacío. Dale tamaño y radio con clases para que coincida con lo que sustituye.
Animaciones
animation elige un shimmer de barrido, un pulse suave o none.
Texto
<SkeletonText /> dibuja una barra por línea y sigue el tamaño de fuente y la altura de línea del padre, así que ocupa el mismo espacio que el texto al que sustituye. La última línea es más corta.
Envolver contenido real
Con loading, el skeleton renderiza el contenido real de forma invisible debajo, así que adopta el tamaño exacto y nada se desplaza cuando llegan los datos. Cuando loading pasa a false, el contenido aparece con un fundido.
En línea
Pasa render={<span />} para colocar un skeleton dentro de una frase. Se sitúa sobre la línea base del texto.
Carga rápida
Un skeleton permanece invisible durante sus primeros 150ms y luego aparece con un fundido. Los datos que llegan antes nunca muestran un marcador de posición parpadeante.
Muchas filas
Los skeletons que se montan juntos inician su animación juntos, así que una lista larga se lee como una sola área de carga.
De derecha a izquierda
En un diseño de derecha a izquierda el shimmer barre de derecha a izquierda.
- Un skeleton por sí solo es decorativo y se oculta a las tecnologías de asistencia, igual que
<SkeletonText />. - Un skeleton que envuelve contenido define
aria-busymientras carga. El contenido de debajo se oculta a las tecnologías de asistencia y no se puede enfocar hasta que carga. - Los skeletons no anuncian nada. Cuando la gente necesite saber qué se está cargando, añade una etiqueta visible o un mensaje de estado.
- Con movimiento reducido activado, los skeletons aparecen de inmediato sin shimmer, pulso ni fundido.
Acepta todos los atributos del elemento que renderiza.
| Prop | Tipo | Predeterminado |
|---|---|---|
animation | "shimmer" | "pulse" | "none" | "shimmer" |
loadingCuando se define, el skeleton envuelve a sus hijos: true muestra el marcador y false muestra el contenido. Omítelo para un marcador independiente. | boolean | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="skeleton" | Apunta a los skeletons en CSS. |
data-animation | La animación en uso. Se elimina cuando el contenido envuelto ha cargado. |
data-loading | "true" o "false" cuando el skeleton envuelve contenido. |
data-slot="skeleton-content" | Envuelve el contenido real. Invisible e inerte mientras carga. |
--skeleton-dir | 1, o -1 en diseños de derecha a izquierda. Define la dirección del shimmer. |
Acepta todos los atributos de <div>.
| Prop | Tipo | Predeterminado |
|---|---|---|
linesSe redondea hacia abajo y se mantiene entre 1 y 50. | number | 3 |
animation | "shimmer" | "pulse" | "none" | "shimmer" |
| Atributo | Descripción |
|---|---|
data-slot="skeleton-text" | El contenedor de las líneas. |
- AlertMensajes en línea para estado y comentarios, con una superficie neutra, un icono de color y un descarte que se colapsa con suavidad.
- EmptyUn marcador de posición para pantallas que aún no tienen nada que mostrar, con un icono, un mensaje y la siguiente acción.
- ProgressUna barra o anillo que muestra cuánto ha avanzado una tarea, se suaviza entre actualizaciones y se desliza mientras el total es desconocido.
- 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.
- Aspect ratioUn contenedor que mantiene su forma antes de que cargue el contenido multimedia, muestra un brillo mientras carga, hace aparecer el contenido con un fundido y muestra una alternativa si falla.
Usado en bloques
Bloques que se construyen sobre Skeleton.
- 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.
- ArtifactEl panel junto a un chat de IA que muestra lo que creó el modelo. Páginas web, SVG, documentos y código llegan en streaming y luego pasan a una vista previa en sandbox, con versiones que puedes comparar y restaurar, una división redimensionable y una hoja inferior en móviles.
- BillingPlan y uso para un producto de IA, al estilo de Cursor, Claude y Vercel. Un medidor de uso dividido por modelo que proyecta el final del ciclo y avisa antes de que se agoten los créditos, un gráfico diario por el que puedes desplazarte, un límite de gasto con alertas que puedes previsualizar en el medidor, cambios de plan con prorrateo exacto, un formulario de tarjeta con validación real y facturas descargables en PDF.
- 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.