پرتوپرتو

حالت‌های خالی

راهنمای طراحی حالت‌های خالی — از صفر نتیجه تا حالت اولیه و مسیر گم‌شده

معرفی

حالت‌های خالی زمانی ظاهر می‌شوند که محتوایی برای نمایش وجود ندارد. یک حالت خالی خوب سه کار انجام می‌دهد: وضعیت را توضیح می‌دهد، علت را بیان می‌کند، و یک اقدام واضح پیشنهاد می‌دهد.

جدول با صفر نتیجه

نام اینفلوئنسرپلتفرمنرخ تعامل

نتیجه‌ای یافت نشد

فیلترهای خود را تغییر دهید

حالت اولیه — هنوز داده‌ای اضافه نشده

اینفلوئنسری اضافه نشده

اولین اینفلوئنسر را به لیست پایش خود اضافه کنید


انواع حالت خالی

سه نوع اصلی وجود دارد:

نوعتوضیحمثال
صفر نتیجهجستجو یا فیلتر نتیجه‌ای نداشتجستجوی اینفلوئنسر — نتیجه نیافت
حالت اولیهکاربر هنوز داده‌ای اضافه نکردهلیست اینفلوئنسرها — هنوز خالی است
مسیر گم‌شدهآدرس یا منبع وجود نداردپروفایل اینفلوئنسر حذف‌شده

کامپوننت 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 برای نتیجه صفر — این خطا نیست
  • نوشتن پیام منفی («هیچ نتیجه‌ای نیست») به جای راهنما («فیلترها را تغییر دهید»)

صفحات مرتبط