Presets

Blocks

Get PRO

Need premium blocks and templates? Upgrade to PRO and get access.

Upgrade
JoinLogin
Presets
Monochrome
Overview
  • Introduction
  • Components
  • Installation
Components
  • Accordion
  • Alert
  • Alert Dialog
  • Aspect Ratio
  • Avatar
  • Badge
  • Breadcrumb
  • Button
  • Button Group
  • CalendarNEW
  • Card
  • CarouselNEW
  • Checkbox
  • Collapsible
  • Dialog
  • Dropdown Menu
  • Empty
  • Field
  • Input
  • Input Group
  • Item
  • Kbd
  • Label
  • Native Select
  • Scroll Area
  • SelectNEW
  • Separator
  • SwitchNEW
  • Table
  • Tabs
  • Textarea
  • TooltipNEW

Empty

PreviousNext

Use the Empty component to display an empty state.

1import { Button } from "@/components/ui/button";2import {3  Empty,4  EmptyContent,

Installation

pnpm dlx sprawlify@latest add empty
npx sprawlify@latest add empty
yarn sprawlify@latest add empty
bunx --bun sprawlify@latest add empty

Install the following dependencies:

pnpm add @sprawlify/primitives @sprawlify/solid
npm install @sprawlify/primitives @sprawlify/solid
yarn add @sprawlify/primitives @sprawlify/solid
bun add @sprawlify/primitives @sprawlify/solid

Add the following files to your project:

empty.tsx
1import { cva, type VariantProps } from "class-variance-authority";2import { cn } from "@/lib/utils";3import { sprawlify } from "@sprawlify/solid";4import { splitProps, type ComponentProps } from "solid-js";56function Empty(props: ComponentProps<typeof sprawlify.div>) {7  const [local, others] = splitProps(props, ["class"]);89  return (10    <sprawlify.div11      data-scope="empty"12      data-part="root"13      data-slot="empty"14      class={cn(15        "gap-4 rounded-xl border-dashed p-6 flex w-full min-w-0 flex-1 flex-col items-center justify-center text-center text-balance",16        local.class,17      )}18      {...others}19    />20  );21}2223function EmptyHeader(props: ComponentProps<typeof sprawlify.div>) {24  const [local, others] = splitProps(props, ["class"]);2526  return (27    <sprawlify.div28      data-slot="empty-header"29      class={cn("gap-2 flex max-w-sm flex-col items-center", local.class)}30      {...others}31    />32  );33}3435const emptyMediaVariants = cva(36  "mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0",37  {38    variants: {39      variant: {40        default: "bg-transparent",41        icon: "bg-muted text-foreground flex size-8 shrink-0 items-center justify-center rounded-lg [&_svg:not([class*='size-'])]:size-4",42      },43    },44    defaultVariants: {45      variant: "default",46    },47  },48);4950function EmptyMedia(51  props: ComponentProps<typeof sprawlify.div> &52    VariantProps<typeof emptyMediaVariants> & { variant?: "default" | "icon" },53) {54  const [local, others] = splitProps(props, ["class", "variant"]);55  const variant = () => local.variant || "default";5657  return (58    <sprawlify.div59      data-slot="empty-icon"60      data-variant={variant()}61      class={cn(emptyMediaVariants({ variant: variant(), class: local.class }))}62      {...others}63    />64  );65}6667function EmptyTitle(props: ComponentProps<typeof sprawlify.div>) {68  const [local, others] = splitProps(props, ["class"]);6970  return (71    <sprawlify.div72      data-slot="empty-title"73      class={cn("text-sm font-medium tracking-tight", local.class)}74      {...others}75    />76  );77}7879function EmptyDescription(props: ComponentProps<typeof sprawlify.p>) {80  const [local, others] = splitProps(props, ["class"]);8182  return (83    <sprawlify.p84      data-slot="empty-description"85      class={cn(86        "text-sm/relaxed text-muted-foreground [&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4",87        local.class,88      )}89      {...others}90    />91  );92}9394function EmptyContent(props: ComponentProps<typeof sprawlify.div>) {95  const [local, others] = splitProps(props, ["class"]);9697  return (98    <sprawlify.div99      data-slot="empty-content"100      class={cn(101        "gap-2.5 text-sm flex w-full max-w-sm min-w-0 flex-col items-center text-balance",102        local.class,103      )}104      {...others}105    />106  );107}108109export { Empty, EmptyHeader, EmptyTitle, EmptyDescription, EmptyContent, EmptyMedia };110

Update the import paths to match your project setup.

Usage

1import {
2  Empty,
3  EmptyHeader,
4  EmptyTitle,
5  EmptyDescription,
6  EmptyContent,
7  EmptyMedia
8} from "@/components/ui/empty"
1<Empty>
2  <EmptyHeader>
3    <EmptyMedia variant="icon">
4      <Icon />
5    </EmptyMedia>
6    <EmptyTitle>No data</EmptyTitle>
7    <EmptyDescription>No data found</EmptyDescription>
8  </EmptyHeader>
9  <EmptyContent>
10    <Button>Add data</Button>
11  </EmptyContent>
12</Empty>

Examples

Avatar

Use the EmptyMedia component to display an avatar in the empty state.

1import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";2import { Button } from "@/components/ui/button";3import {4  Empty,

Avatar Group

Use the EmptyMedia component to display an avatar group in the empty state.

1import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";2import { Button } from "@/components/ui/button";3import {4  Empty,

Background

Use the bg-* and bg-gradient-* utilities to add a background to the empty state.

1import { Button } from "@/components/ui/button";2import {3  Empty,4  EmptyContent,

Outline

Use the border utility class to create an outline empty state.

1import { Button } from "@/components/ui/button";2import {3  Empty,4  EmptyContent,

On This Page

InstallationUsageExamplesAvatarAvatar GroupBackgroundOutline

Get PRO

Need premium blocks and templates? Upgrade to PRO and get access.