vaiperui

componentes / skeleton

Skeleton

Marcador de carga con la forma del contenido: líneas de texto, título, avatar, rectángulo o tarjeta.

Cómo usar

Decorativo (`aria-hidden`), así que usa `aria-busy` en el contenedor mientras carga. El pulso se detiene con `prefers-reduced-motion`. Cambia el tamaño con `width`/`height` o `className`; `lines` dibuja varias líneas de texto, la última más corta.

preview
Skeleton.tsx
import { Skeleton } from "vaiperui";
<div aria-busy={loading}>
<Skeleton variant="avatar" />
<Skeleton variant="title" width="60%" />
<Skeleton lines={3} />
</div>

Variantes

preview
text
title
avatar
rectangle
card
variantes.tsx
<Skeleton variant="text" />
<Skeleton variant="title" />
<Skeleton variant="avatar" />
<Skeleton variant="rectangle" />
<Skeleton variant="card" />

Líneas y estático

preview
lines={3}
animation="none"
lineas.tsx
<Skeleton lines={3} />
<Skeleton animation="none" variant="card" />

Props

PropValoresPredeterminadoDescripción
varianttext | title | avatar | rectangle | cardtextForma y tamaño por defecto
linesnumber1solo text: número de líneas; la última de varias es más corta
width / heightnumber | stringpor varianteTamaño CSS (un número es px)
radiusnone | sm | md | lg | fullpor varianteReemplaza el redondeo
animationpulse | nonepulseEl pulso se apaga con prefers-reduced-motion
(nativas)HTMLAttributes<HTMLDivElement>ningunorole (reemplaza el predeterminado), className, style, aria-*, ref, etc.

Accesibilidad

  • Cada elemento es `aria-hidden="true"`, así que los lectores de pantalla ignoran el marcador por completo.
  • No tiene role ni texto; no transmite nada por sí solo.
  • La animación de pulso usa `motion-reduce:animate-none`, así que se detiene con `prefers-reduced-motion`.
  • Pasa `animation="none"` para renderizar un marcador estático.

Ten en cuenta

  • Skeleton no define `aria-busy` ni anuncia nada: pon `aria-busy` tú mismo en el contenedor que carga.
  • Si el usuario necesita saber que la carga empezó o terminó, anúncialo en tu propia región live (por ejemplo un texto `role="status"` visualmente oculto).