پرتوپرتو

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

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

معرفی

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

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

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

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

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

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

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

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

یک پیاده‌سازی کامل و کپی‌بردار از این الگو به‌عنوان بلاک شروع کار با پارتو موجود است.


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

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

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

کامپوننت Empty

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

import { , , , ,  } from '@partodata/ui'
;<>
  <>اینفلوئنسری اضافه نشده</>
  <>اولین اینفلوئنسر را به لیست پایش خود اضافه کنید</>
  <>
    < ="primary">افزودن اینفلوئنسر</>
  </>
</>

صفر نتیجه

جدول

وقتی جستجو یا فیلتر نتیجه‌ای ندارد، یک ردیف واحد با پیام نمایش دهید:

import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from '@partodata/ui'
import { Search } from 'lucide-react'
;<Table>
  <TableHeader>
    <TableRow>
      <TableHead>نام اینفلوئنسر</TableHead>
      <TableHead>پلتفرم</TableHead>
      <TableHead>نرخ تعامل</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 { , , , , ,  } from '@partodata/ui'
import type {  } from '@partodata/ui'

type  = { : string; : string }
declare const : <>[]
declare function (): void
;<
  ={}
  ={[]}
  ={
    <>
      <>نتیجه‌ای یافت نشد</>
      <>فیلترها را تغییر دهید</>
      <>
        < ="outline" ={}>
          پاک کردن فیلترها
        </>
      </>
    </>
  }
/>

حالت اولیه

ارائه‌ای (با 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-foreground-lighter py-8">
        هیچ داده‌ای وجود ندارد
      </TableCell>
    </TableRow>
  </TableBody>
</Table>

مسیر گم‌شده

وقتی کاربر به URL نادرست یا منبع حذف‌شده رسیده:

import { Alert, AlertTitle, AlertDescription } from '@partodata/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 text-brand hover:text-brand-600">
        بازگشت به لیست اینفلوئنسرها
      </a>
    </AlertDescription>
  </Alert>
</div>

بهترین روش‌ها

  • همیشه یک اقدام واضح پیشنهاد دهید — «پاک کردن فیلترها» یا «افزودن اولین آیتم»
  • حالت خالی باید شکل کلی محتوای واقعی را حفظ کند (header جدول باقی بماند)
  • Skeleton قبل از empty state نمایش داده می‌شود — چیدمان نباید در انتقال تغییر کند
  • پیام خالی را مثبت بنویسید: «اینفلوئنسری اضافه نشده» نه «هیچ اینفلوئنسری وجود ندارد»

دام‌های رایج

  • نمایش صفحه سفید بدون هیچ پیامی
  • حذف header جدول در حالت خالی — ناگهانی به نظر می‌رسد
  • استفاده از ErrorState به جای empty state برای نتیجه صفر — این خطا نیست
  • نوشتن پیام منفی («هیچ نتیجه‌ای نیست») به جای راهنما («فیلترها را تغییر دهید»)

صفحات مرتبط