حالتهای خالی
راهنمای طراحی حالتهای خالی — از صفر نتیجه تا حالت اولیه و مسیر گمشده
معرفی
حالتهای خالی زمانی ظاهر میشوند که محتوایی برای نمایش وجود ندارد. یک حالت خالی خوب سه کار انجام میدهد: وضعیت را توضیح میدهد، علت را بیان میکند، و یک اقدام واضح پیشنهاد میدهد.
جدول با صفر نتیجه
| نام اینفلوئنسر | پلتفرم | نرخ تعامل |
|---|---|---|
نتیجهای یافت نشد فیلترهای خود را تغییر دهید | ||
حالت اولیه — هنوز دادهای اضافه نشده
اینفلوئنسری اضافه نشده
اولین اینفلوئنسر را به لیست پایش خود اضافه کنید
انواع حالت خالی
سه نوع اصلی وجود دارد:
| نوع | توضیح | مثال |
|---|---|---|
| صفر نتیجه | جستجو یا فیلتر نتیجهای نداشت | جستجوی اینفلوئنسر — نتیجه نیافت |
| حالت اولیه | کاربر هنوز دادهای اضافه نکرده | لیست اینفلوئنسرها — هنوز خالی است |
| مسیر گمشده | آدرس یا منبع وجود ندارد | پروفایل اینفلوئنسر حذفشده |
کامپوننت Empty
برای حالتهای خالی کامپوننت از کامپوننت Empty استفاده کنید:
import { Empty } from '@parto-system-design/ui'
<Empty
title="اینفلوئنسری اضافه نشده"
description="اولین اینفلوئنسر را به لیست پایش خود اضافه کنید"
action={<Button variant="primary">افزودن اینفلوئنسر</Button>}
/>صفر نتیجه
جدول
وقتی جستجو یا فیلتر نتیجهای ندارد، یک ردیف واحد با پیام نمایش دهید:
import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from '@parto-system-design/ui'
import { Search } from 'lucide-react'
<Table>
<TableHeader>
<TableRow>
<TableHead className="text-muted">نام اینفلوئنسر</TableHead>
<TableHead className="text-muted">پلتفرم</TableHead>
<TableHead className="text-muted">نرخ تعامل</TableHead>
</TableRow>
</TableHeader>
<TableBody>
<TableRow className="hover:bg-transparent">
<TableCell colSpan={3} className="text-center py-10">
<div className="flex flex-col items-center gap-2">
<Search className="h-8 w-8 text-muted-foreground/40" />
<p className="text-sm text-muted-foreground">نتیجهای یافت نشد</p>
<p className="text-xs text-muted-foreground">فیلترها را تغییر دهید یا جستجوی جدیدی انجام دهید</p>
</div>
</TableCell>
</TableRow>
</TableBody>
</Table>DataGrid با Empty component
برای DataTable از prop داخلی emptyState استفاده کنید:
import { DataTable, Empty } from '@parto-system-design/ui'
<DataTable
columns={columns}
data={[]}
emptyState={
<Empty
title="نتیجهای یافت نشد"
description="فیلترها را تغییر دهید"
action={<Button variant="outline" onClick={clearFilters}>پاک کردن فیلترها</Button>}
/>
}
/>حالت اولیه
ارائهای (با onboarding)
وقتی کاربر برای اولین بار با ویژگیای روبرو میشود:
<div className="flex flex-col items-center justify-center min-h-[300px] rounded-lg border border-dashed p-8">
<Users className="h-12 w-12 text-muted-foreground/40 mb-4" />
<h3 className="text-base font-semibold mb-2">اینفلوئنسری اضافه نشده</h3>
<p className="text-sm text-muted-foreground text-center mb-6 max-w-xs">
اینفلوئنسرهای مورد نظر را به لیست پایش اضافه کنید تا آمار و تحلیلهای آنها را ببینید
</p>
<Button variant="primary">افزودن اینفلوئنسر</Button>
</div>اطلاعاتی (بدون onboarding)
وقتی ویژگی ساده است و نیازی به راهنمایی ندارد:
<Table>
<TableBody>
<TableRow className="hover:bg-transparent">
<TableCell colSpan={columnCount} className="text-center text-muted py-8">
هیچ دادهای وجود ندارد
</TableCell>
</TableRow>
</TableBody>
</Table>مسیر گمشده
وقتی کاربر به URL نادرست یا منبع حذفشده رسیده:
import { Alert, AlertTitle, AlertDescription } from '@parto-system-design/ui'
import { AlertCircle } from 'lucide-react'
<div className="flex items-center justify-center min-h-[300px]">
<Alert variant="destructive" className="max-w-md">
<AlertCircle className="h-4 w-4" />
<AlertTitle>یافت نشد</AlertTitle>
<AlertDescription>
این پروفایل وجود ندارد یا حذف شده است.
<a href="/influencers" className="block mt-2 underline">بازگشت به لیست اینفلوئنسرها</a>
</AlertDescription>
</Alert>
</div>بهترین روشها
- همیشه یک اقدام واضح پیشنهاد دهید — «پاک کردن فیلترها» یا «افزودن اولین آیتم»
- حالت خالی باید شکل کلی محتوای واقعی را حفظ کند (header جدول باقی بماند)
- Skeleton قبل از empty state نمایش داده میشود — چیدمان نباید در انتقال تغییر کند
- پیام خالی را مثبت بنویسید: «اینفلوئنسری اضافه نشده» نه «هیچ اینفلوئنسری وجود ندارد»
دامهای رایج
- نمایش صفحه سفید بدون هیچ پیامی
- حذف header جدول در حالت خالی — ناگهانی به نظر میرسد
- استفاده از
ErrorStateبه جای empty state برای نتیجه صفر — این خطا نیست - نوشتن پیام منفی («هیچ نتیجهای نیست») به جای راهنما («فیلترها را تغییر دهید»)
صفحات مرتبط
- الگوهای خطا — وقتی بارگذاری با خطا مواجه شد
- الگوهای بارگذاری — Skeleton قبل از empty state
- Empty — کامپوننت آماده برای حالت خالی
- DataTable — prop
emptyStateداخلی