خالی (Empty)

از کامپوننت Empty برای نمایش حالت خالی استفاده کنید.

نصب (Installation)

npx @quark-lab/rad-ui add empty

نمونه‌ها (Examples)

نمونه پایه (Basic Example)

ساده‌ترین شکل استفاده از کامپوننت Empty با آیکون، عنوان، توضیحات و دکمه.

هنوز پروژه‌ای ایجاد نشده

شما هنوز پروژه‌ای ایجاد نکرده‌اید. برای شروع اولین پروژه خود را ایجاد کنید.

مشاهده کد
1import {
2  Empty,
3  EmptyHeader,
4  EmptyMedia,
5  EmptyTitle,
6  EmptyDescription,
7  EmptyContent,
8} from "@/components/ui/empty";
9import { Button } from "@/components/ui/button";
10import { FolderOpen } from "lucide-react";
11
12export default function BasicEmpty() {
13  return (
14    <Empty>
15      <EmptyHeader>
16        <EmptyMedia variant="icon">
17          <FolderOpen className="h-12 w-12" />
18        </EmptyMedia>
19        <EmptyTitle>هنوز پروژه‌ای ایجاد نشده</EmptyTitle>
20        <EmptyDescription>
21          شما هنوز پروژه‌ای ایجاد نکرده‌اید. برای شروع اولین پروژه خود را ایجاد کنید.
22        </EmptyDescription>
23      </EmptyHeader>
24      <EmptyContent>
25        <Button>ایجاد پروژه</Button>
26      </EmptyContent>
27    </Empty>
28  );
29}

حاشیه‌دار (Outline)

استفاده از کلاس border برای ایجاد حالت خالی با حاشیه.

فضای ذخیره‌سازی ابری خالی

فایل‌های خود را در فضای ذخیره‌سازی ابری آپلود کنید تا در هر کجا به آن‌ها دسترسی داشته باشید.

مشاهده کد
1import {
2  Empty,
3  EmptyHeader,
4  EmptyMedia,
5  EmptyTitle,
6  EmptyDescription,
7  EmptyContent,
8} from "@/components/ui/empty";
9import { Button } from "@/components/ui/button";
10import { UploadCloud } from "lucide-react";
11
12export default function OutlineEmpty() {
13  return (
14    <Empty className="border rounded-lg p-8">
15      <EmptyHeader>
16        <EmptyMedia variant="icon">
17          <UploadCloud className="h-12 w-12" />
18        </EmptyMedia>
19        <EmptyTitle>فضای ذخیره‌سازی ابری خالی</EmptyTitle>
20        <EmptyDescription>
21          فایل‌های خود را در فضای ذخیره‌سازی ابری آپلود کنید تا در هر کجا به آن‌ها دسترسی داشته باشید.
22        </EmptyDescription>
23      </EmptyHeader>
24      <EmptyContent>
25        <Button>آپلود فایل</Button>
26      </EmptyContent>
27    </Empty>
28  );
29}

با پس‌زمینه (Background)

استفاده از کلاس‌های bg-* برای افزودن پس‌زمینه به حالت خالی.

هیچ اعلانی وجود ندارد

شما همه چیز را به‌روز کرده‌اید. اعلان‌های جدید در اینجا نمایش داده می‌شوند.

مشاهده کد
1import {
2  Empty,
3  EmptyHeader,
4  EmptyMedia,
5  EmptyTitle,
6  EmptyDescription,
7  EmptyContent,
8} from "@/components/ui/empty";
9import { Button } from "@/components/ui/button";
10import { Bell } from "lucide-react";
11
12export default function BackgroundEmpty() {
13  return (
14    <Empty className="bg-muted/50 rounded-lg p-8">
15      <EmptyHeader>
16        <EmptyMedia variant="icon">
17          <Bell className="h-12 w-12" />
18        </EmptyMedia>
19        <EmptyTitle>هیچ اعلانی وجود ندارد</EmptyTitle>
20        <EmptyDescription>
21          شما همه چیز را به‌روز کرده‌اید. اعلان‌های جدید در اینجا نمایش داده می‌شوند.
22        </EmptyDescription>
23      </EmptyHeader>
24      <EmptyContent>
25        <Button variant="outline">بروزرسانی</Button>
26      </EmptyContent>
27    </Empty>
28  );
29}

با آواتار (Avatar)

استفاده از کامپوننت EmptyMedia برای نمایش آواتار در حالت خالی.

کاربر

کاربر آفلاین است

این کاربر در حال حاضر آفلاین است. می‌توانید پیامی برای اطلاع‌رسانی به او بگذارید یا بعداً دوباره تلاش کنید.

مشاهده کد
1import {
2  Empty,
3  EmptyHeader,
4  EmptyMedia,
5  EmptyTitle,
6  EmptyDescription,
7  EmptyContent,
8} from "@/components/ui/empty";
9import { Avatar, AvatarFallback } from "@/components/ui/avatar";
10import { Button } from "@/components/ui/button";
11
12export default function AvatarEmpty() {
13  return (
14    <Empty>
15      <EmptyHeader>
16        <EmptyMedia>
17          <Avatar className="h-16 w-16">
18            <AvatarFallback>کاربر</AvatarFallback>
19          </Avatar>
20        </EmptyMedia>
21        <EmptyTitle>کاربر آفلاین است</EmptyTitle>
22        <EmptyDescription>
23          این کاربر در حال حاضر آفلاین است. می‌توانید پیامی برای اطلاع‌رسانی به او بگذارید یا بعداً دوباره تلاش کنید.
24        </EmptyDescription>
25      </EmptyHeader>
26      <EmptyContent>
27        <Button variant="outline">گذاشتن پیام</Button>
28      </EmptyContent>
29    </Empty>
30  );
31}

گروه آواتار (Avatar Group)

استفاده از EmptyMedia برای نمایش گروهی از آواتارها.

CNLRER

هیچ عضو تیمی وجود ندارد

اعضای تیم خود را دعوت کنید تا در این پروژه همکاری کنند.

مشاهده کد
1import {
2  Empty,
3  EmptyHeader,
4  EmptyMedia,
5  EmptyTitle,
6  EmptyDescription,
7  EmptyContent,
8} from "@/components/ui/empty";
9import { Avatar, AvatarFallback } from "@/components/ui/avatar";
10import { Button } from "@/components/ui/button";
11
12export default function AvatarGroupEmpty() {
13  return (
14    <Empty>
15      <EmptyHeader>
16        <EmptyMedia>
17          <div className="flex -space-x-2">
18            <Avatar className="h-12 w-12 border-2 border-background">
19              <AvatarFallback>CN</AvatarFallback>
20            </Avatar>
21            <Avatar className="h-12 w-12 border-2 border-background">
22              <AvatarFallback>LR</AvatarFallback>
23            </Avatar>
24            <Avatar className="h-12 w-12 border-2 border-background">
25              <AvatarFallback>ER</AvatarFallback>
26            </Avatar>
27          </div>
28        </EmptyMedia>
29        <EmptyTitle>هیچ عضو تیمی وجود ندارد</EmptyTitle>
30        <EmptyDescription>
31          اعضای تیم خود را دعوت کنید تا در این پروژه همکاری کنند.
32        </EmptyDescription>
33      </EmptyHeader>
34      <EmptyContent>
35        <Button>دعوت اعضا</Button>
36      </EmptyContent>
37    </Empty>
38  );
39}

با گروه ورودی (InputGroup)

می‌توانید کامپوننت InputGroup را به EmptyContent اضافه کنید.

404 - صفحه یافت نشد

صفحه‌ای که به دنبال آن هستید وجود ندارد. در زیر جستجو کنید.

نیاز به کمک دارید؟ با پشتیبانی تماس بگیرید

مشاهده کد
1import {
2  Empty,
3  EmptyHeader,
4  EmptyMedia,
5  EmptyTitle,
6  EmptyDescription,
7  EmptyContent,
8} from "@/components/ui/empty";
9import {
10  InputGroup,
11  InputGroupInput,
12  InputGroupButton,
13} from "@/components/ui/input-group";
14import { Search } from "lucide-react";
15
16export default function InputGroupEmpty() {
17  return (
18    <Empty>
19      <EmptyHeader>
20        <EmptyMedia variant="icon">
21          <Search className="h-12 w-12" />
22        </EmptyMedia>
23        <EmptyTitle>404 - صفحه یافت نشد</EmptyTitle>
24        <EmptyDescription>
25          صفحه‌ای که به دنبال آن هستید وجود ندارد. در زیر جستجو کنید.
26        </EmptyDescription>
27      </EmptyHeader>
28      <EmptyContent>
29        <InputGroup className="max-w-md">
30          <InputGroupInput placeholder="جستجو..." />
31          <InputGroupButton size="icon-sm">
32            <Search className="h-4 w-4" />
33          </InputGroupButton>
34        </InputGroup>
35        <p className="text-sm text-muted-foreground mt-4">
36          نیاز به کمک دارید؟{" "}
37          <a href="#" className="underline">
38            با پشتیبانی تماس بگیرید
39          </a>
40        </p>
41      </EmptyContent>
42    </Empty>
43  );
44}

مرجع API (API Reference)

Empty

کامپوننت اصلی که به عنوان کانتینر برای حالت خالی عمل می‌کند.

پراپ (Prop)نوع (Type)پیش‌فرض (Default)توضیحات (Description)
classNamestring-کلاس‌های CSS سفارشی

EmptyHeader

رسانه، عنوان و توضیحات حالت خالی را در بر می‌گیرد.

پراپ (Prop)نوع (Type)پیش‌فرض (Default)توضیحات (Description)
classNamestring-کلاس‌های CSS سفارشی

EmptyMedia

برای نمایش رسانه حالت خالی مانند آیکون یا تصویر استفاده می‌شود. همچنین می‌توانید از آن برای نمایش کامپوننت‌های دیگر مانند آواتار استفاده کنید.

پراپ (Prop)نوع (Type)پیش‌فرض (Default)توضیحات (Description)
variant"default" | "icon""default"نوع نمایش رسانه (پیش‌فرض یا آیکون)
classNamestring-کلاس‌های CSS سفارشی

EmptyTitle

برای نمایش عنوان حالت خالی استفاده می‌شود. از تگ h3 استفاده می‌کند.

پراپ (Prop)نوع (Type)پیش‌فرض (Default)توضیحات (Description)
classNamestring-کلاس‌های CSS سفارشی

EmptyDescription

برای نمایش توضیحات حالت خالی استفاده می‌شود.

پراپ (Prop)نوع (Type)پیش‌فرض (Default)توضیحات (Description)
classNamestring-کلاس‌های CSS سفارشی

EmptyContent

برای نمایش محتوای حالت خالی مانند دکمه، ورودی یا لینک استفاده می‌شود.

پراپ (Prop)نوع (Type)پیش‌فرض (Default)توضیحات (Description)
classNamestring-کلاس‌های CSS سفارشی

دسترسی‌پذیری (Accessibility)

ساختار معنایی (Semantic Structure)

EmptyTitle از تگ h3 استفاده می‌کند که برای خوانندگان صفحه سلسله‌مراتب مناسبی ایجاد می‌کند.

پشتیبانی از RTL

تمام کامپوننت‌ها از ویژگی‌های منطقی CSS استفاده می‌کنند و در هر دو جهت RTL و LTR به درستی کار می‌کنند.

کنتراست رنگ (Color Contrast)

تمام ترکیب‌های رنگی استانداردهای WCAG 2.1 AA را رعایت می‌کنند.

بهترین شیوه‌ها (Best Practices)

ساختار حالت خالی (Empty Structure)

  • EmptyHeader: همیشه با رسانه (آیکون یا تصویر) شروع کنید تا کاربر بداند چه چیزی خالی است
  • EmptyTitle: عنوان واضح و مختصر برای توضیح وضعیت خالی
  • EmptyDescription: توضیحات مفصل‌تر برای راهنمایی کاربر
  • EmptyContent: اقدامات یا ورودی‌هایی که کاربر می‌تواند انجام دهد

استفاده از EmptyMedia

  • variant="icon": برای آیکون‌های ساده که نیاز به استایل خاص دارند
  • variant="default": برای تصاویر، آواتارها یا کامپوننت‌های دیگر

استایل‌دهی سفارشی

می‌توانید با استفاده از کلاس‌های Tailwind مانند border یا bg-muted/50 ظاهر حالت خالی را سفارشی کنید.

نحوه استفاده (Usage)

نمونه کامل از نحوه ایمپورت و استفاده از کامپوننت Empty.

هیچ داده‌ای وجود ندارد

هیچ داده‌ای یافت نشد. برای شروع داده اضافه کنید.

مشاهده کد
1import {
2  Empty,
3  EmptyHeader,
4  EmptyMedia,
5  EmptyTitle,
6  EmptyDescription,
7  EmptyContent,
8} from "@/components/ui/empty";
9import { Button } from "@/components/ui/button";
10import { Package } from "lucide-react";
11
12export default function MyComponent() {
13  return (
14    <Empty>
15      <EmptyHeader>
16        <EmptyMedia variant="icon">
17          <Package className="h-12 w-12" />
18        </EmptyMedia>
19        <EmptyTitle>هیچ داده‌ای وجود ندارد</EmptyTitle>
20        <EmptyDescription>
21          هیچ داده‌ای یافت نشد. برای شروع داده اضافه کنید.
22        </EmptyDescription>
23      </EmptyHeader>
24      <EmptyContent>
25        <Button>افزودن داده</Button>
26      </EmptyContent>
27    </Empty>
28  );
29}

مثال‌های پیشرفته (Advanced Examples)

حاشیه‌دار (Outline)

استفاده از کلاس border برای ایجاد حالت خالی با حاشیه.

فضای ذخیره‌سازی ابری خالی

فایل‌های خود را در فضای ذخیره‌سازی ابری آپلود کنید تا در هر کجا به آن‌ها دسترسی داشته باشید.

مشاهده کد
1import {
2  Empty,
3  EmptyHeader,
4  EmptyMedia,
5  EmptyTitle,
6  EmptyDescription,
7  EmptyContent,
8} from "@/components/ui/empty";
9import { Button } from "@/components/ui/button";
10import { UploadCloud } from "lucide-react";
11
12export default function OutlineEmpty() {
13  return (
14    <Empty className="border rounded-lg p-8">
15      <EmptyHeader>
16        <EmptyMedia variant="icon">
17          <UploadCloud className="h-12 w-12" />
18        </EmptyMedia>
19        <EmptyTitle>فضای ذخیره‌سازی ابری خالی</EmptyTitle>
20        <EmptyDescription>
21          فایل‌های خود را در فضای ذخیره‌سازی ابری آپلود کنید تا در هر کجا به آن‌ها دسترسی داشته باشید.
22        </EmptyDescription>
23      </EmptyHeader>
24      <EmptyContent>
25        <Button>آپلود فایل</Button>
26      </EmptyContent>
27    </Empty>
28  );
29}

با پس‌زمینه (Background)

استفاده از کلاس‌های bg-* برای افزودن پس‌زمینه به حالت خالی.

هیچ اعلانی وجود ندارد

شما همه چیز را به‌روز کرده‌اید. اعلان‌های جدید در اینجا نمایش داده می‌شوند.

مشاهده کد
1import {
2  Empty,
3  EmptyHeader,
4  EmptyMedia,
5  EmptyTitle,
6  EmptyDescription,
7  EmptyContent,
8} from "@/components/ui/empty";
9import { Button } from "@/components/ui/button";
10import { Bell } from "lucide-react";
11
12export default function BackgroundEmpty() {
13  return (
14    <Empty className="bg-muted/50 rounded-lg p-8">
15      <EmptyHeader>
16        <EmptyMedia variant="icon">
17          <Bell className="h-12 w-12" />
18        </EmptyMedia>
19        <EmptyTitle>هیچ اعلانی وجود ندارد</EmptyTitle>
20        <EmptyDescription>
21          شما همه چیز را به‌روز کرده‌اید. اعلان‌های جدید در اینجا نمایش داده می‌شوند.
22        </EmptyDescription>
23      </EmptyHeader>
24      <EmptyContent>
25        <Button variant="outline">بروزرسانی</Button>
26      </EmptyContent>
27    </Empty>
28  );
29}

با گروه ورودی (InputGroup)

استفاده از InputGroup در EmptyContent برای جستجو یا ورودی.

404 - صفحه یافت نشد

صفحه‌ای که به دنبال آن هستید وجود ندارد. در زیر جستجو کنید.

نیاز به کمک دارید؟ با پشتیبانی تماس بگیرید

مشاهده کد
1import {
2  Empty,
3  EmptyHeader,
4  EmptyMedia,
5  EmptyTitle,
6  EmptyDescription,
7  EmptyContent,
8} from "@/components/ui/empty";
9import {
10  InputGroup,
11  InputGroupInput,
12  InputGroupButton,
13} from "@/components/ui/input-group";
14import { Search } from "lucide-react";
15
16export default function InputGroupEmpty() {
17  return (
18    <Empty>
19      <EmptyHeader>
20        <EmptyMedia variant="icon">
21          <Search className="h-12 w-12" />
22        </EmptyMedia>
23        <EmptyTitle>404 - صفحه یافت نشد</EmptyTitle>
24        <EmptyDescription>
25          صفحه‌ای که به دنبال آن هستید وجود ندارد. در زیر جستجو کنید.
26        </EmptyDescription>
27      </EmptyHeader>
28      <EmptyContent>
29        <InputGroup className="max-w-md">
30          <InputGroupInput placeholder="جستجو..." />
31          <InputGroupButton size="icon-sm">
32            <Search className="h-4 w-4" />
33          </InputGroupButton>
34        </InputGroup>
35        <p className="text-sm text-muted-foreground mt-4">
36          نیاز به کمک دارید؟{" "}
37          <a href="#" className="underline">
38            با پشتیبانی تماس بگیرید
39          </a>
40        </p>
41      </EmptyContent>
42    </Empty>
43  );
44}