> ## Documentation Index
> Fetch the complete documentation index at: https://api.fanvue.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# EmptyState

> A placeholder for a view with nothing in it yet: media or icon, title, description and up to two actions, in five title and five media sizes.

```tsx theme={null}
import { EmptyState } from "@fanvue/ui";
import type { EmptyStateProps, EmptyStateSlot, EmptyStateVariant } from "@fanvue/ui";
```

## Examples

## Default

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-emptystate--default&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="360" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="EmptyState — Default" />
</Frame>

```tsx theme={null}
import { Button, EmptyState } from "@fanvue/ui";

function EmptyVaultArtwork() {
  return (
    <div className="relative h-full w-full bg-surface-secondary">
      <div className="absolute top-8 left-5 size-20 rounded-full bg-surface-primary" />
      <div className="absolute top-5 left-24 size-36 rounded-full bg-surface-tertiary" />
      <div className="absolute top-20 left-40 size-24 rounded-full bg-surface-primary" />
    </div>
  );
}

const defaultArgs = {
  title: "Empty Vault, Full Potential!",
  description:
    "Add your photos to the Vault to start sharing your creations and earning! The more you add, the more opportunities you will unlock to grow your audience and income.",
  media: <EmptyVaultArtwork />,
  primaryAction: <Button variant="brand">Add Media to Vault</Button>,
};

<EmptyState
  variant="default"
  titleSize="lg"
  mediaSize="lg"
  title="Empty Vault, Full Potential!"
  description="Add your photos to the Vault to start sharing your creations and earning! The more you add, the more opportunities you w…"
  media={<EmptyVaultArtwork />}
  primaryAction={<Button variant="brand">Add Media to Vault</Button>}
/>
```

## Small Title Size

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-emptystate--small-title-size&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="360" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="EmptyState — Small Title Size" />
</Frame>

```tsx theme={null}
import { Button, EmptyState } from "@fanvue/ui";

function EmptyVaultArtwork() {
  return (
    <div className="relative h-full w-full bg-surface-secondary">
      <div className="absolute top-8 left-5 size-20 rounded-full bg-surface-primary" />
      <div className="absolute top-5 left-24 size-36 rounded-full bg-surface-tertiary" />
      <div className="absolute top-20 left-40 size-24 rounded-full bg-surface-primary" />
    </div>
  );
}

const defaultArgs = {
  title: "Empty Vault, Full Potential!",
  description:
    "Add your photos to the Vault to start sharing your creations and earning! The more you add, the more opportunities you will unlock to grow your audience and income.",
  media: <EmptyVaultArtwork />,
  primaryAction: <Button variant="brand">Add Media to Vault</Button>,
};

<EmptyState
  variant="default"
  title="Empty Vault, Full Potential!"
  description="Add your photos to the Vault to start sharing your creations and earning! The more you add, the more opportunities you w…"
  media={<EmptyVaultArtwork />}
  primaryAction={<Button variant="brand">Add Media to Vault</Button>}
  titleSize="sm"
/>
```

## With Secondary Action

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-emptystate--with-secondary-action&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="360" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="EmptyState — With Secondary Action" />
</Frame>

```tsx theme={null}
import { Button, EmptyState } from "@fanvue/ui";

function EmptyVaultArtwork() {
  return (
    <div className="relative h-full w-full bg-surface-secondary">
      <div className="absolute top-8 left-5 size-20 rounded-full bg-surface-primary" />
      <div className="absolute top-5 left-24 size-36 rounded-full bg-surface-tertiary" />
      <div className="absolute top-20 left-40 size-24 rounded-full bg-surface-primary" />
    </div>
  );
}

const defaultArgs = {
  title: "Empty Vault, Full Potential!",
  description:
    "Add your photos to the Vault to start sharing your creations and earning! The more you add, the more opportunities you will unlock to grow your audience and income.",
  media: <EmptyVaultArtwork />,
  primaryAction: <Button variant="brand">Add Media to Vault</Button>,
};

<EmptyState
  variant="default"
  title="Empty Vault, Full Potential!"
  description="Add your photos to the Vault to start sharing your creations and earning! The more you add, the more opportunities you w…"
  media={<EmptyVaultArtwork />}
  primaryAction={<Button variant="brand">Add Media to Vault</Button>}
  secondaryAction={<Button variant="secondary">Learn more</Button>}
/>
```

## Centered

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-emptystate--centered&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="360" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="EmptyState — Centered" />
</Frame>

```tsx theme={null}
import { Button, EmptyState } from "@fanvue/ui";

function EmptyVaultArtwork() {
  return (
    <div className="relative h-full w-full bg-surface-secondary">
      <div className="absolute top-8 left-5 size-20 rounded-full bg-surface-primary" />
      <div className="absolute top-5 left-24 size-36 rounded-full bg-surface-tertiary" />
      <div className="absolute top-20 left-40 size-24 rounded-full bg-surface-primary" />
    </div>
  );
}

const defaultArgs = {
  title: "Empty Vault, Full Potential!",
  description:
    "Add your photos to the Vault to start sharing your creations and earning! The more you add, the more opportunities you will unlock to grow your audience and income.",
  media: <EmptyVaultArtwork />,
  primaryAction: <Button variant="brand">Add Media to Vault</Button>,
};

<EmptyState
  variant="centered"
  title="Empty Vault, Full Potential!"
  description="Add your photos to the Vault to start sharing your creations and earning! The more you add, the more opportunities you w…"
  media={<EmptyVaultArtwork />}
  primaryAction={<Button variant="brand">Add Media to Vault</Button>}
/>
```

## Small Media

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-emptystate--small-media&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="360" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="EmptyState — Small Media" />
</Frame>

```tsx theme={null}
import { Button, EmptyState } from "@fanvue/ui";

function EmptyVaultArtwork() {
  return (
    <div className="relative h-full w-full bg-surface-secondary">
      <div className="absolute top-8 left-5 size-20 rounded-full bg-surface-primary" />
      <div className="absolute top-5 left-24 size-36 rounded-full bg-surface-tertiary" />
      <div className="absolute top-20 left-40 size-24 rounded-full bg-surface-primary" />
    </div>
  );
}

const defaultArgs = {
  title: "Empty Vault, Full Potential!",
  description:
    "Add your photos to the Vault to start sharing your creations and earning! The more you add, the more opportunities you will unlock to grow your audience and income.",
  media: <EmptyVaultArtwork />,
  primaryAction: <Button variant="brand">Add Media to Vault</Button>,
};

<EmptyState
  variant="default"
  title="Empty Vault, Full Potential!"
  description="Add your photos to the Vault to start sharing your creations and earning! The more you add, the more opportunities you w…"
  media={<EmptyVaultArtwork />}
  primaryAction={<Button variant="brand">Add Media to Vault</Button>}
  mediaSize="sm"
/>
```

## Props

## EmptyState

<ParamField path="description" type="EmptyStateSlot">
  Supporting body copy. Strings use library body styles; pass a node for rich text.
</ParamField>

<ParamField path="media" type="EmptyStateSlot">
  Top visual / illustration slot. A string is treated as an image URL (`<img src={…}>`); pass a node for custom layout.
</ParamField>

<ParamField path="mediaSize" type="&#x22;md&#x22; | &#x22;sm&#x22; | &#x22;lg&#x22; | &#x22;xs&#x22; | &#x22;xl&#x22;" default="lg">
  Height of the media container.
</ParamField>

<ParamField path="primaryAction" type="EmptyStateSlot">
  Primary call to action. A string renders a brand `Button` with that label; pass a node for links, loading, etc.
</ParamField>

<ParamField path="secondaryAction" type="EmptyStateSlot">
  Secondary action below the primary. A string renders a secondary `Button` with that label; pass a node when you need more control.
</ParamField>

<ParamField path="title" type="EmptyStateSlot">
  Main heading. Strings use library heading styles; pass a node for full control.
</ParamField>

<ParamField path="titleSize" type="&#x22;md&#x22; | &#x22;sm&#x22; | &#x22;lg&#x22; | &#x22;xs&#x22; | &#x22;xl&#x22;" default="lg">
  Size of the title heading — mapped internally to bold heading typography tokens.
</ParamField>

<ParamField path="variant" type="&#x22;default&#x22; | &#x22;centered&#x22;" default="default">
  Matches Figma property `Property 1` (`Default` / `centered`).
</ParamField>

## Exported types

Also exported from `@fanvue/ui`: `EmptyStateProps`, `EmptyStateSlot`, `EmptyStateVariant`.

***

**Setup:** [Installation](/docs/ui/installation) · [Theming](/docs/ui/theming)
