Indicador de carga
Un indicador de carga animado para envíos pendientes, recuperaciones de datos y estados de ocupado en línea: un icono listo para usar con cualquier control neobrutalista.
import {
Item,
ItemContent,El spinner es un único icono animado que señala una operación en curso. Envuelve el LoaderIcon de lucide-react con animate-spin y trae de fábrica role="status" y un aria-label; no hay ninguna biblioteca de primitivas de por medio, así que ambos backends comparten la misma implementación, y hereda currentColor para integrarse con cualquier control neobrutalista en el que se coloque.
Recurre a este componente cuando:
- Envíos pendientes — ponlo dentro de un botón mientras corre la mutación; la etiqueta no se mueve.
- Estados de carga en línea — insignias, grupos de campos y celdas de tabla a la espera de datos.
- Cargas a nivel de sección — combínalo con
Emptymientras el contenido de un panel va llegando.
Instalación#
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 y pega el siguiente código en tu proyecto.
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 }
Ajusta las rutas de importación según la configuración de tu proyecto.
Uso#
import { Spinner } from "@/components/ui/spinner"<Spinner />Personalización#
Puedes reemplazar el icono predeterminado del spinner por cualquier otro icono modificando el 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 }Ejemplos#
Tamaño#
Usa la clase utilitaria size-* para cambiar el tamaño del spinner.
import { Spinner } from "@/components/ui/spinner"
export function SpinnerSize() {Button#
Añade un spinner a un botón para indicar un estado de carga. Coloca <Spinner /> antes de la etiqueta con data-icon="inline-start" para una posición inicial, o después de la etiqueta con data-icon="inline-end" para una posición final.
import { Button } from "@/components/ui/button"
import { Spinner } from "@/components/ui/spinner"
Badge#
Añade un spinner a un badge para indicar un estado de carga. Coloca <Spinner /> antes de la etiqueta con data-icon="inline-start" para una posición inicial, o después de la etiqueta con data-icon="inline-end" para una posición final.
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#
Para activar el soporte RTL en Neobrutalism, consulta la guía de configuración RTL.
"use client"
import * as React from "react"Accesibilidad#
El spinner renderiza role="status" con aria-label="Loading", así que los lectores de pantalla anuncian el estado de carga sin cableado adicional. Cuando un texto cercano ya describe el estado («Guardando…»), pasa mejor aria-hidden="true" al spinner: con un solo anuncio basta. Para toda una región que entra en estado de carga, define aria-busy="true" en el contenedor.