Search for a command to run...
An indicator that can be used to show a loading state.
npx shadcn@latest add @zaidan/spinnerpnpx shadcn add @zaidan/spinneryarn dlx shadcn@latest add @zaidan/spinnerbunx shadcn@latest add @zaidan/spinnerCopy and paste the following code into your project.
1import { LoaderCircle } from "lucide-solid";2import type { ComponentProps } from "solid-js";3import { splitProps } from "solid-js";4
5import { cn } from "~/lib/utils";6
7type SpinnerProps = ComponentProps<"svg"> & {8 class?: string | undefined;9};10
11const Spinner = (props: SpinnerProps) => {12 const [local, others] = splitProps(props, ["class"]);13 return (14 <LoaderCircle15 role="status"16 aria-label="Loading"17 class={cn("z-spinner size-4 animate-spin", local.class)}18 data-slot="spinner"19 {...others}20 />21 );22};23
24export { Spinner };You can replace the default spinner icon with any other icon by editing the Spinner component.
1import { Loader2 } from "lucide-solid"2import { splitProps, type ComponentProps } from "solid-js"3
4import { cn } from "~/lib/utils"5
6type SpinnerProps = ComponentProps<"svg"> & {7 class?: string | undefined8}9
10const Spinner = (props: SpinnerProps) => {11 const [local, others] = splitProps(props, ["class"])12 return (13 <Loader214 role="status"15 aria-label="Loading"16 class={cn("size-4 animate-spin", local.class)}17 {...others}18 />19 )20}21
22export { Spinner }Here are the source code of all the examples from the preview page:
import { Spinner } from "~/components/ui/spinner";function SpinnerBasic() { return ( <Example title="Basic"> <div class="flex items-center gap-6"> <Spinner /> <Spinner class="size-6" /> </div> </Example> );}import { Button } from "~/components/ui/button";import { Spinner } from "~/components/ui/spinner";function SpinnerInButtons() { return ( <Example title="In Buttons"> <div class="flex flex-wrap items-center gap-4"> <Button> <Spinner data-icon="inline-start" /> Submit </Button> <Button disabled> <Spinner data-icon="inline-start" /> Disabled </Button> <Button variant="outline" disabled> <Spinner data-icon="inline-start" /> Outline </Button> <Button variant="outline" size="icon" disabled> <Spinner data-icon="inline-start" /> <span class="sr-only">Loading...</span> </Button> </div> </Example> );}import { Badge } from "~/components/ui/badge";import { Spinner } from "~/components/ui/spinner";function SpinnerInBadges() { return ( <Example title="In Badges" class="items-center justify-center"> <div class="flex flex-wrap items-center justify-center gap-4"> <Badge> <Spinner data-icon="inline-start" /> Badge </Badge> <Badge variant="secondary"> <Spinner data-icon="inline-start" /> Badge </Badge> <Badge variant="destructive"> <Spinner data-icon="inline-start" /> Badge </Badge> <Badge variant="outline"> <Spinner data-icon="inline-start" /> Badge </Badge> </div> </Example> );}import { Field, FieldLabel } from "~/components/ui/field";import { InputGroup, InputGroupAddon, InputGroupInput } from "~/components/ui/input-group";import { Spinner } from "~/components/ui/spinner";function SpinnerInInputGroup() { return ( <Example title="In Input Group"> <Field> <FieldLabel for="input-group-spinner">Input Group</FieldLabel> <InputGroup> <InputGroupInput id="input-group-spinner" /> <InputGroupAddon align="inline-end"> <Spinner /> </InputGroupAddon> </InputGroup> </Field> </Example> );}import { ArrowRight } from "lucide-solid";import { Button } from "~/components/ui/button";import { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle,} from "~/components/ui/empty";import { Spinner } from "~/components/ui/spinner";function SpinnerInEmpty() { return ( <Example title="In Empty State" containerClass="lg:col-span-full"> <Empty class="min-h-[300px]"> <EmptyHeader> <EmptyMedia variant="icon"> <Spinner /> </EmptyMedia> <EmptyTitle>No projects yet</EmptyTitle> <EmptyDescription> You haven't created any projects yet. Get started by creating your first project. </EmptyDescription> </EmptyHeader> <EmptyContent> <div class="flex gap-2"> <Button as="a" href="#"> Create project </Button> <Button variant="outline">Import project</Button> </div> <Button as="a" href="#" variant="link" class="text-muted-foreground"> Learn more <ArrowRight /> </Button> </EmptyContent> </Empty> </Example> );}Use the Spinner component to display a spinner.
| Prop | Type | Default |
|---|---|---|
class | string | `` |
<Spinner />