Indicateur de chargement
Un indicateur de chargement animé pour les soumissions en attente, les récupérations de données et les états « occupé » intégrés — une icône prête à l'emploi pour n'importe quel contrôle « néobrutaliste ».
import {
Item,
ItemContent,Le spinner est une simple icône animée qui signale une opération en cours. Il enveloppe la LoaderIcon de lucide-react avec animate-spin et fournit d’office role="status" et un aria-label — aucune bibliothèque de primitives en jeu, donc les deux backends partagent la même implémentation, et il hérite de currentColor pour s’accorder au contrôle néobrutaliste qui l’accueille.
À privilégier dans ces cas :
- Envois en attente — glissez-le dans un bouton pendant que la mutation s’exécute ; le libellé reste en place.
- États de chargement en ligne — badges, groupes de champs et cellules de tableau en attente de données.
- Chargements de section — associez-le à
Emptypendant qu’un panneau se remplit.
Installation#
pnpm dlx shadcn@latest add https://neobrutalism.com/r/base/spinner.jsonnpx shadcn@latest add https://neobrutalism.com/r/base/spinner.jsonyarn dlx shadcn@latest add https://neobrutalism.com/r/base/spinner.jsonbunx --bun shadcn@latest add https://neobrutalism.com/r/base/spinner.json
Copiez-collez le code suivant dans votre projet.
import { Loader2Icon } from "lucide-react"
import { cn } from "@/lib/utils"
function Spinner({ className, ...props }: React.ComponentProps<"svg">) {
return (
<Loader2Icon
data-slot="spinner"
role="status"
aria-label="Loading"
className={cn("size-4 animate-spin", className)}
{...props}
/>
)
}
export { Spinner }
Adaptez les chemins d’import à la configuration de votre projet.
Utilisation#
import { Spinner } from "@/components/ui/spinner"<Spinner />Personnalisation#
Vous pouvez remplacer l’icône par défaut du spinner par n’importe quelle autre icône en modifiant le composant Spinner.
import { LoaderIcon } from "lucide-react"
import { cn } from "@/lib/utils"import { LoaderIcon } from "lucide-react"
import { cn } from "@/lib/utils"
function Spinner({ className, ...props }: React.ComponentProps<"svg">) {
return (
<LoaderIcon
role="status"
aria-label="Loading"
className={cn("size-4 animate-spin", className)}
{...props}
/>
)
}
export { Spinner }Exemples#
Taille#
Utilisez la classe utilitaire size-* pour modifier la taille du spinner.
import { Spinner } from "@/components/ui/spinner"
export function SpinnerSize() {Button#
Ajoutez un spinner à un bouton pour signaler un état de chargement. Placez <Spinner /> avant le libellé avec data-icon="inline-start" pour une position de début, ou après le libellé avec data-icon="inline-end" pour une position de fin.
import { Button } from "@/components/ui/button"
import { Spinner } from "@/components/ui/spinner"
Badge#
Ajoutez un spinner à un badge pour signaler un état de chargement. Placez <Spinner /> avant le libellé avec data-icon="inline-start" pour une position de début, ou après le libellé avec data-icon="inline-end" pour une position de fin.
import { Badge } from "@/components/ui/badge"
import { Spinner } from "@/components/ui/spinner"
Input Group#
import { ArrowUpIcon } from "lucide-react"
import {Empty#
import { Button } from "@/components/ui/button"
import {
Empty,RTL#
Pour activer le RTL dans Neobrutalism, consultez le guide de configuration RTL.
"use client"
import * as React from "react"Accessibilité#
Le spinner rend role="status" avec aria-label="Loading", si bien que les lecteurs d’écran annoncent l’état de chargement sans câblage supplémentaire. Quand un texte voisin décrit déjà l’état (« Enregistrement… »), passez plutôt aria-hidden="true" au spinner — une seule annonce suffit. Pour toute une région qui bascule en chargement, posez aria-busy="true" sur le conteneur.