Skeleton
Des placeholders qui attendent 150ms avant de s’afficher, prennent la taille exacte du contenu qu’ils enveloppent et l’affichent en fondu sans rien déplacer.
pnpm dlx shadcn@latest add https://hextaui.com/r/skeleton.jsonAjoute le composant, les tokens de thème HextaUI et les composants HextaUI dont il dépend.
Ajoutez les tokens de thème à votre CSS global, si ce n’est pas déjà fait.
Installez les dépendances.
pnpm add @base-ui/react class-variance-authority cn tw-animate-cssCopiez et collez le code suivant dans votre projet.
components/ui/skeleton.tsx Mettez à jour les chemins d’import selon la configuration de votre projet.
Le shimmer et la pulsation utilisent deux animations de votre thème. Ajoutez-les une fois à votre fichier CSS global.
Utilisez un skeleton seul comme placeholder dimensionné, ou passez loading et enveloppez le vrai contenu pour que le placeholder prenne sa taille exacte.
Formes
Seul, un skeleton est un bloc vide. Donnez-lui une taille et un rayon avec des classes pour correspondre à ce qu'il remplace.
Animations
animation choisit un shimmer qui balaie, une pulse douce, ou none.
Texte
<SkeletonText /> trace une barre par ligne et suit la taille de police et la hauteur de ligne du parent, pour occuper le même espace que le texte qu'il remplace. La dernière ligne est plus courte.
Envelopper du vrai contenu
Avec loading, le skeleton rend le vrai contenu de façon invisible en dessous, prend donc sa taille exacte, et rien ne bouge à l'arrivée des données. Quand loading passe à false, le contenu apparaît en fondu.
En ligne
Passez render={<span />} pour placer un skeleton dans une phrase. Il se pose sur la ligne de base du texte.
Chargement rapide
Un skeleton reste invisible pendant ses 150ms initiales, puis apparaît en fondu. Les données qui arrivent plus vite n'affichent jamais de placeholder en éclair.
Nombreuses lignes
Les skeletons montés ensemble démarrent leur animation ensemble, si bien qu'une longue liste se lit comme une seule zone de chargement.
De droite à gauche
Dans une mise en page de droite à gauche, le shimmer balaie de droite à gauche.
- Un skeleton seul est décoratif et masqué aux technologies d'assistance, tout comme
<SkeletonText />. - Un skeleton qui enveloppe du contenu définit
aria-busypendant le chargement. Le contenu en dessous est masqué aux technologies d'assistance et ne peut pas recevoir le focus avant son chargement. - Les skeletons n'annoncent rien. Quand il faut savoir ce qui se charge, ajoutez un label visible ou un message de statut.
- Avec la réduction des animations, les skeletons apparaissent aussitôt, sans shimmer, pulsation ni fondu.
Accepte tous les attributs de l'élément qu'il rend.
| Prop | Type | Par défaut |
|---|---|---|
animation | "shimmer" | "pulse" | "none" | "shimmer" |
loadingLorsqu'il est défini, le skeleton enveloppe ses enfants : true affiche le placeholder, false affiche le contenu. Omettez-le pour un placeholder autonome. | boolean | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="skeleton" | Cible les skeletons en CSS. |
data-animation | L'animation utilisée. Retirée une fois le contenu enveloppé chargé. |
data-loading | "true" ou "false" quand le skeleton enveloppe du contenu. |
data-slot="skeleton-content" | Enveloppe le vrai contenu. Invisible et inerte pendant le chargement. |
--skeleton-dir | 1, ou -1 dans les mises en page de droite à gauche. Définit la direction du shimmer. |
Accepte tous les attributs de <div>.
| Prop | Type | Par défaut |
|---|---|---|
linesArrondi à l'inférieur et borné entre 1 et 50. | number | 3 |
animation | "shimmer" | "pulse" | "none" | "shimmer" |
| Attribut | Description |
|---|---|
data-slot="skeleton-text" | Le conteneur des lignes. |
- AlertDes messages en ligne pour le statut et les retours, avec une surface neutre, une icône colorée et une fermeture qui se replie en douceur.
- EmptyUn espace réservé pour les écrans sans contenu à afficher, avec une icône, un message et l’action suivante.
- ProgressUne barre ou un anneau qui montre l’avancement d’une tâche, s’adoucit entre les mises à jour et glisse tant que le total est inconnu.
- SpinnerUn indicateur de chargement avec des graduations façon Apple ou un anneau qui respire, pouvant attendre avant de s’afficher et rester assez longtemps pour ne pas clignoter.
- ToastDe brefs messages qui s’empilent proprement, se déploient au survol, se balayent pour disparaître et transforment un état de chargement en succès ou en erreur sur place.
- Aspect ratioUne boîte qui garde sa forme avant le chargement du média, scintille pendant le chargement, fait apparaître le média en fondu et bascule sur un repli en cas d’échec.
Utilisé dans les blocks
Des blocks qui s’appuient sur Skeleton.
- API keysLa page des clés d’API d’un produit d’IA, comme les consoles d’OpenAI et d’Anthropic. Créez des clés avec des permissions limitées et une expiration, voyez le secret une seule fois avec une copie qui confirme, révoquez avec annulation, renommez sur place, effectuez une rotation avec période de grâce et consultez l’utilisation par clé.
- ArtifactLe panneau à côté d’un chat IA qui montre ce que le modèle a produit. Pages web, SVG, documents et code arrivent en direct, puis passent à un aperçu isolé en sandbox, avec des versions à comparer et à restaurer, une séparation redimensionnable et une bottom sheet sur mobile.
- BillingForfait et utilisation pour un produit d’IA, dans le style de Cursor, Claude et Vercel. Un compteur d’utilisation réparti par modèle qui projette la fin du cycle et prévient avant la fin des crédits, un graphique quotidien explorable, une limite de dépenses avec des alertes prévisualisables sur le compteur, des changements de forfait avec proratisation exacte, un formulaire de carte avec une vraie validation, et des factures téléchargeables en PDF.
- SecuritySessions et sécurité pour un produit d’IA. Appareils actifs avec déconnexion qui fait disparaître les lignes en animation, changement de mot de passe avec jauge de robustesse en direct, configuration de l’authentification à deux facteurs avec un vrai code QR, une vérification à 6 chiffres et des codes de récupération téléchargeables, des passkeys via WebAuthn, et la suppression du compte derrière une confirmation saisie.