Spinner
Un indicatore di caricamento animato per invii in sospeso, recuperi e stati di occupato in linea: un'icona pronta all'uso per qualsiasi controllo neobrutalista.
import {
Item,
ItemContent,Lo spinner è una singola icona animata che segnala un’operazione in corso. Avvolge la LoaderIcon di lucide-react con animate-spin e include di serie role="status" più un aria-label — nessuna libreria di primitive coinvolta, quindi i due backend condividono la stessa implementazione, ed eredita currentColor per intonarsi a qualunque controllo neobrutalista lo ospiti.
Quando usarlo:
- Invii in attesa — infilalo in un pulsante mentre la mutation è in corso; l’etichetta resta al suo posto.
- Stati di fetch inline — badge, gruppi di input e celle di tabella in attesa di dati.
- Caricamenti a livello di sezione — abbinalo a
Emptymentre un pannello arriva in streaming.
Installazione#
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
Copia e incolla il seguente codice nel tuo progetto.
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 }
Aggiorna i percorsi di importazione in base alla struttura del tuo progetto.
Utilizzo#
import { Spinner } from "@/components/ui/spinner"<Spinner />Personalizzazione#
Puoi sostituire l'icona predefinita dello spinner con qualsiasi altra icona modificando il componente 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 }Esempi#
Dimensione#
Usa la classe di utilità size-* per cambiare la dimensione dello spinner.
import { Spinner } from "@/components/ui/spinner"
export function SpinnerSize() {Button#
Aggiungi uno spinner a un pulsante per indicare uno stato di caricamento. Posiziona <Spinner /> prima dell'etichetta con data-icon="inline-start" per una posizione iniziale, o dopo l'etichetta con data-icon="inline-end" per una posizione finale.
import { Button } from "@/components/ui/button"
import { Spinner } from "@/components/ui/spinner"
Badge#
Aggiungi uno spinner a un badge per indicare uno stato di caricamento. Posiziona <Spinner /> prima dell'etichetta con data-icon="inline-start" per una posizione iniziale, o dopo l'etichetta con data-icon="inline-end" per una posizione finale.
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#
Per abilitare il supporto RTL in Neobrutalism, consulta la guida alla configurazione RTL.
"use client"
import * as React from "react"Accessibilità#
Lo spinner viene reso con role="status" e aria-label="Loading", quindi gli screen reader annunciano lo stato di caricamento senza cablaggi aggiuntivi. Quando un testo vicino descrive già lo stato (“Salvataggio…”), passa piuttosto aria-hidden="true" allo spinner — un annuncio basta. Per un’intera regione che entra in stato di caricamento, imposta aria-busy="true" sul contenitore.