Індикатор завантаження
Анімований індикатор завантаження для очікуючих операцій відправки, отримання даних та вбудованих станів зайнятості — іконка, яку можна легко інтегрувати в будь-який елемент управління у стилі «необруталізм».
import {
Item,
ItemContent,Spinner — одна анімована іконка, що сигналізує про операцію «в польоті». Обгортає LoaderIcon з lucide-react через animate-spin і «з коробки» має role="status" плюс aria-label — без примітивної бібліотеки, тож обидва бекенди ділять одну реалізацію, і вона успадковує currentColor, щоб пасувати до необруталістського контролю, у якому сидить.
Коли це стане в пригоді:
- Очікування submit — підставте в кнопку, поки триває mutation; мітка лишається на місці.
- Inline-стани fetch — badge, input group і клітинки таблиці, що чекають на дані.
- Завантаження секцій — поєднайте з
Empty, поки панель підвантажується.
Встановлення#
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
Скопіюйте та вставте наведений код у свій проєкт.
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 }
Оновіть шляхи імпорту відповідно до налаштувань вашого проєкту.
Використання#
import { Spinner } from "@/components/ui/spinner"<Spinner />Налаштування#
Ви можете замінити стандартну піктограму спінера будь-якою іншою піктограмою, відредагувавши компонент 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 }Приклади#
Розмір#
Використовуйте службовий клас size-*, щоб змінити розмір спінера.
import { Spinner } from "@/components/ui/spinner"
export function SpinnerSize() {Button#
Додайте спінер до кнопки, щоб показати стан завантаження. Розмістіть <Spinner /> перед підписом із data-icon="inline-start" для позиції на початку або після підпису з data-icon="inline-end" для позиції в кінці.
import { Button } from "@/components/ui/button"
import { Spinner } from "@/components/ui/spinner"
Badge#
Додайте спінер до бейджа, щоб показати стан завантаження. Розмістіть <Spinner /> перед підписом із data-icon="inline-start" для позиції на початку або після підпису з data-icon="inline-end" для позиції в кінці.
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#
Щоб увімкнути підтримку RTL у Neobrutalism, перегляньте посібник із налаштування RTL.
"use client"
import * as React from "react"Доступність#
Spinner рендерить role="status" з aria-label="Loading", тож програми зчитування з екрана оголошують стан завантаження без додаткової обв’язки. Коли сусідній текст уже описує стан («Збереження…»), передайте на spinner aria-hidden="true" — одного оголошення достатньо. Для цілого регіону, що переходить у стан завантаження, ставте aria-busy="true" на контейнер.