Spinner
Indikator pemuatan animasi untuk proses pengiriman, pengambilan data, dan status sibuk inline yang sedang berlangsung — ikon siap pakai untuk kontrol neobrutalis apa pun.
import {
Item,
ItemContent,Spinner adalah satu ikon beranimasi yang menandakan sebuah operasi sedang berjalan. Komponen ini membungkus LoaderIcon dari lucide-react dengan animate-spin dan sudah menyertakan role="status" plus aria-label bawaan — tanpa pustaka primitif apa pun, sehingga kedua backend memakai implementasi yang sama, dan ia mewarisi currentColor agar serasi dengan kontrol neobrutalis mana pun yang menampungnya.
Cocok digunakan untuk:
- Pengiriman yang tertunda — sisipkan ke dalam tombol selagi mutasi berjalan; labelnya tetap di tempat.
- Status pengambilan data sebaris — badge, grup input, dan sel tabel yang sedang menunggu data.
- Pemuatan setingkat bagian — padukan dengan
Emptyselagi sebuah panel dimuat.
Instalasi#
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
Salin dan tempel kode berikut ke dalam proyek Anda.
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 }
Sesuaikan jalur impor dengan pengaturan proyek Anda.
Penggunaan#
import { Spinner } from "@/components/ui/spinner"<Spinner />Kustomisasi#
Anda dapat mengganti ikon spinner default dengan ikon lain apa pun dengan mengedit komponen 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 }Contoh#
Ukuran#
Gunakan kelas utilitas size-* untuk mengubah ukuran spinner.
import { Spinner } from "@/components/ui/spinner"
export function SpinnerSize() {Button#
Tambahkan spinner ke tombol untuk menunjukkan status pemuatan. Tempatkan <Spinner /> sebelum label dengan data-icon="inline-start" untuk posisi awal, atau setelah label dengan data-icon="inline-end" untuk posisi akhir.
import { Button } from "@/components/ui/button"
import { Spinner } from "@/components/ui/spinner"
Badge#
Tambahkan spinner ke badge untuk menunjukkan status pemuatan. Tempatkan <Spinner /> sebelum label dengan data-icon="inline-start" untuk posisi awal, atau setelah label dengan data-icon="inline-end" untuk posisi akhir.
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#
Untuk mengaktifkan dukungan RTL di Neobrutalism, lihat panduan konfigurasi RTL.
"use client"
import * as React from "react"Aksesibilitas#
Spinner merender role="status" dengan aria-label="Loading", sehingga pembaca layar mengumumkan status memuat tanpa perkabelan tambahan. Bila teks di dekatnya sudah menjelaskan statusnya ("Menyimpan…"), berikan aria-hidden="true" pada spinner saja — satu pengumuman sudah cukup. Untuk seluruh wilayah yang beralih ke status memuat, setel aria-busy="true" pada kontainernya.