Pagination
ناوبری بین صفحههای یک فهرست بلند. فلش «قبلی» در چیدمان راستبهچپ به راست اشاره میکند و «بعدی» به چپ؛ برعکسِ چیزی که یک صفحهبندی ترجمهشده نشان میدهد.
این کامپوننت فعلاً برای ۱ فریمورک از ۴ فریمورک آماده است.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
نصب
با CLI اختصاصی dig-ui کامپوننت را از رجیستری دیگ نصب کنید؛ وابستگیها و فایلها خودکار اضافه میشوند.
pnpm dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/pagination.jsonnpx dig-ui@latest add https://design-system-tau-green.vercel.app/r/pagination.jsonyarn dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/pagination.jsonbunx --bun dig-ui@latest add https://design-system-tau-green.vercel.app/r/pagination.jsonاین کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
استفاده
import {
Pagination,
PaginationContent,
PaginationEllipsis,
PaginationItem,
PaginationLink,
PaginationNext,
PaginationPrevious,
} from "@/components/ui/pagination"
import { toFaDigits } from "@/lib/persian"
<Pagination>
<PaginationContent>
<PaginationItem>
<PaginationPrevious href="/products?page=1" />
</PaginationItem>
<PaginationItem>
<PaginationLink href="/products?page=2" isActive>
{toFaDigits(2)}
</PaginationLink>
</PaginationItem>
<PaginationItem>
<PaginationNext href="/products?page=3" />
</PaginationItem>
</PaginationContent>
</Pagination>این کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
ترکیب اجزا
دسترسپذیری
- کل ناحیه یک nav با aria-label=«صفحهبندی» است تا کاربر صفحهخوان بتواند مستقیم به آن بپرد.
- صفحهٔ فعلی aria-current="page" میگیرد؛ فقط رنگِ متفاوت کافی نیست.
- دکمههای قبلی و بعدی aria-label فارسی دارند، چون در موبایل متنشان پنهان میشود و فقط فلش دیده میشود.
- سهنقطه aria-hidden است و متن «صفحههای بیشتر» فقط برای صفحهخوان باقی میماند؛ چون خودش هدف کلیک نیست.
- اگر صفحهٔ قبلی یا بعدی وجود ندارد، بهجای غیرفعالکردن ظاهری، لینک را با aria-disabled و حذف href از دسترس خارج کنید.
مرجع API
Pagination
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| className | string | — | پیشفرض وسطچین و تمامعرض است؛ برای چسباندن به ابتدای صفحه mx-0 و justify-start بدهید. |
| ...props | React.ComponentProps<"nav"> | — | همهٔ ویژگیهای تگ nav پشتیبانی میشود. |
PaginationLink
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| isActive | boolean | false | صفحهٔ فعلی؛ هم ظاهر outline میگیرد و هم aria-current="page". |
| size | "default" | "sm" | "lg" | "icon" | "icon" | اندازه از buttonVariants میآید؛ برای شمارههای چندرقمی default مناسبتر است. |
| href | string | — | مقصد لینک؛ کامپوننت خودش هیچ ناوبریای انجام نمیدهد. |
PaginationPrevious / PaginationNext
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| children | React.ReactNode | "قبلی" / "بعدی" | متن دکمه که در موبایل پنهان و در دسکتاپ دیده میشود. |
| aria-label | string | "صفحهٔ قبلی" / "صفحهٔ بعدی" | برچسب صفحهخوان؛ در صورت نیاز بازنویسی کنید. |
PaginationContent / PaginationItem / PaginationEllipsis
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| PaginationContent | React.ComponentProps<"ul"> | — | ردیف افقی آیتمها. |
| PaginationItem | React.ComponentProps<"li"> | — | هر خانهٔ فهرست؛ دور هر لینک یکی بگذارید. |
| PaginationEllipsis | React.ComponentProps<"span"> | — | نشانگر صفحههای حذفشده؛ aria-hidden است و کلیکپذیر نیست. |
این کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
نمونهها
All Pages
وقتی تعداد صفحهها کم است، همه را نشان دهید و از سهنقطه استفاده نکنید.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
With Ellipsis
الگوی رایج برای فهرستهای بلند: اولین صفحه، چند صفحهٔ اطراف صفحهٔ فعلی و آخرین صفحه.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Previous and Next Only
برای فهرستهایی که تعداد کل صفحهها معلوم نیست (مثل نتایج جستجوی زنده) شمارهها را حذف کنید.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Custom Arrow Labels
children دکمههای قبلی و بعدی را عوض میکند؛ برچسب دسترسپذیری سر جایش میماند.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
With Next.js Link
PaginationLink یک تگ a ساده است و ناوبری کامل صفحه انجام میدهد. برای ناوبری کلاینتی، بهجای آن Link را با همان buttonVariants رندر کنید.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
صفحهٔ اول و آخر (Disabled)
در صفحهٔ اول، دکمهٔ «قبلی» را حذف نکنید؛ بیاثرش کنید. حذفکردن جای بقیهٔ دکمهها را جابهجا میکند و کاربر هر بار باید دوباره هدف بگیرد. با aria-disabled صفحهخوان هم میفهمد.
در صفحهٔ اول و آخر، دکمهٔ متناظر با aria-disabled و pointer-events-none بیاثر میشود، نه اینکه حذف شود؛ جای دکمهها ثابت میماند.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
تعداد زیاد صفحه (Overflow)
همهٔ شمارهها را نشان ندهید. صفحهٔ اول، آخر، و همسایههای صفحهٔ جاری کافی است و بقیه با سهنقطه جمع میشوند؛ اینطور عرض کنترل ثابت میماند.
همیشه صفحهٔ اول، آخر، و همسایههای صفحهٔ جاری را نگه دارید؛ بقیه با سهنقطه جمع میشوند.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
یک صفحه (Empty)
وقتی فقط یک صفحه وجود دارد، صفحهبندی هیچ کاری نمیکند و فقط سروصداست. خلاصهٔ تعداد را نگه دارید و کنترل را نشان ندهید.
نمایش ۱ تا ۶ از ۶ مورد
وقتی همهچیز در یک صفحه جا شده، صفحهبندی فقط سروصداست. خلاصهٔ تعداد را نگه دارید و خودِ کنترل را نشان ندهید.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
کدام نمونه برای کدام موقعیت
| نمونه | کجا به کار میآید |
|---|---|
| All Pages | وقتی تعداد صفحهها کم است، همه را نشان دهید و از سهنقطه استفاده نکنید. |
| With Ellipsis | الگوی رایج برای فهرستهای بلند: اولین صفحه، چند صفحهٔ اطراف صفحهٔ فعلی و آخرین صفحه. |
| Previous and Next Only | برای فهرستهایی که تعداد کل صفحهها معلوم نیست (مثل نتایج جستجوی زنده) شمارهها را حذف کنید. |
| Custom Arrow Labels | children دکمههای قبلی و بعدی را عوض میکند؛ برچسب دسترسپذیری سر جایش میماند. |
| With Next.js Link | PaginationLink یک تگ a ساده است و ناوبری کامل صفحه انجام میدهد |
| صفحهٔ اول و آخر (Disabled) | هر فهرست صفحهبندیشدهای |
| تعداد زیاد صفحه (Overflow) | فهرستهای بلند با دهها صفحه |
| یک صفحه (Empty) | فهرستی که همهاش در یک صفحه جا شده |
دستورالعمل استفاده
برای فهرستهای بلند از سهنقطه استفاده کنید
انجام بده
وقتی تعداد صفحهها زیاد است، فقط صفحهٔ اول، چند صفحهٔ اطراف صفحهٔ فعلی و صفحهٔ آخر را نشان دهید و بقیه را با PaginationEllipsis خلاصه کنید.
انجام نده
رندر تکتک ۴۲ صفحه در یک ردیف، هم روی موبایل میشکند و هم پیداکردن صفحهٔ فعلی در میان آن همه عدد را سخت میکند.
صفحهٔ فعلی با isActive، نه فقط رنگ متفاوت
انجام بده
با دادن isActive هم ظاهر outline میگیرد و هم aria-current="page" ست میشود؛ صفحهخوان صفحهٔ فعلی را میشناسد.
انجام نده
بازنویسی رنگ با یک className دستی بهجای isActive، فقط ظاهر را عوض میکند؛ aria-current تنظیم نمیشود و صفحهخوان هیچ فرقی بین صفحهها نمیبیند.
صفحهٔ قبلی/بعدیِ غیرقابلاستفاده را از دسترس خارج کنید
انجام بده
وقتی صفحهٔ قبلی وجود ندارد، href را حذف و aria-disabled را true کنید تا هم ظاهر کمرنگ شود و هم واقعاً غیرقابلکلیک باشد.
انجام نده
کمرنگکردن ظاهریِ دکمه بدون حذف href همچنان یک لینک واقعی و قابل کلیک و قابل فوکوس باقی میگذارد؛ کاربر صفحهکلید و صفحهخوان متوجه غیرفعالبودنش نمیشوند.