جدول (Table)
کامپوننت نمایش داده در قالب جدول
معرفی
کامپوننت Table برای نمایش دادهها در قالب جدول استفاده میشود.
چه زمانی استفاده کنیم:
- برای نمایش دادههای ساختاریافته با ستونهای مشخص و بدون نیاز به تعامل پیچیده
- جداول ساده با کمتر از 5 ردیف بدون مرتبسازی یا صفحهبندی
- نمایش دادههای مقایسهای ساده
چه زمانی استفاده نکنیم:
- برای داده با sorting، filtering، یا pagination — از
DataTableاستفاده کنید - برای نمایش key-value pairs — از
dl/dt/ddیاStatDisplayاستفاده کنید
Table خام ظرف ندارد: همیشه آن را داخل Card بگذارید
ردیفهای Table در تم تیره دقیقاً همرنگ بومِ صفحهاند و در تم روشن فقط یک نوار بیحاشیه میبینید. هر جدول باید روی
یک ظرف (سطح L1: پرکننده + مرز + شعاع + سایه) بنشیند: Card + Table. عکسِ آن، DataTable است که ظرف خودش را دارد و
هرگز داخل Card گذاشته نمیشود. جزئیات و جفتهای درست/نادرست در گرامر بصری.
زمین بازی
با تغییر تنظیمات زیر، پیشنمایش زنده را مشاهده کنید.
| نام | پلتفرم | بازدید |
|---|---|---|
| پست 01 | اینستاگرام | 1,234 |
| پست 02 | توییتر | 2,468 |
| پست 03 | تلگرام | 3,702 |
استفاده
| شماره سفارش | مشتری | مبلغ | وضعیت |
|---|---|---|---|
| #001 | علی احمدی | 120,000 تومان | تکمیل شده |
| #002 | مریم محمدی | 85,000 تومان | در انتظار |
| #003 | رضا کریمی | 95,000 تومان | تکمیل شده |
import { Card, Table, TableBody, TableCaption, TableCell, TableHead, TableHeader, TableRow } from '@partodata/ui'
export default function MyComponent() {
return (
<Card>
<Table>
<TableCaption>لیست کاربران</TableCaption>
<TableHeader>
<TableRow>
<TableHead>نام</TableHead>
<TableHead>ایمیل</TableHead>
<TableHead>نقش</TableHead>
</TableRow>
</TableHeader>
<TableBody>
<TableRow>
<TableCell>محمد احمدی</TableCell>
<TableCell>mohammad@example.com</TableCell>
<TableCell>ادمین</TableCell>
</TableRow>
</TableBody>
</Table>
</Card>
)
}حالتها و انواع
جدول ساده
| شماره سفارش | مشتری | مبلغ | وضعیت |
|---|---|---|---|
| #001 | علی احمدی | 120,000 تومان | تکمیل شده |
| #002 | مریم محمدی | 85,000 تومان | در انتظار |
| #003 | رضا کریمی | 95,000 تومان | تکمیل شده |
تراکم
دو تراکم، بدون عدد دستی (نسخهٔ 4.0):
size | سرِ جدول | ردیف بدنه (حداقل) | متن بدنه | سرِ ستون |
|---|---|---|---|---|
default (پیشفرض) | 40 پیکسل | 44 پیکسل | 14 | 13 / 500 |
compact | 36 پیکسل | 36 پیکسل | 13 | 12 / 500 |
defaultبرای همهٔ جدولهای فهرست؛compactفقط برای جدولهای پرتراکم منشن که ردیفهای زیادی باید همزمان دیده شوند.- متن عادی و عددها وزن regular (400) و اندازهٔ بدنهٔ تراکم جدول را دارند؛ شناسهٔ اصلی ردیف میتواند medium (500) باشد. وضعیت و مقدارهای تصمیمگیری را caption نکنید و برای هیچ وضعیتی وزن semibold، bold یا black نگذارید. اطلاعات فرعی 12px و regular است؛ نشان بومی اندازه و وزن پیشفرض خود (12px / 500) را نگه میدارد. جمعبندی واقعی در footer میتواند medium باشد. سرستون برچسب است: default با 13px / 500 و compact با 12px / 500؛ نقش heading برای آن نگذارید.
- ارتفاع ردیف حداقل است، نه ثابت: سلولی که متنش به خط بعد میرود (
whitespace-normal) ردیف را بلندتر میکند و هیچوقت بریده نمیشود. - سقف محتوای ردیف. فاصلهٔ بالا و پایین سلول 4 پیکسل است، پس ردیف
defaultکنترلهایsm(30 پیکسل، پیشفرض Button) و آواتار تا 32 پیکسل (Avatar size="md") را بدون بلند شدن جا میدهد، و ردیفcompactکنترلهایxs(26) و نشانها و آواتار تا 24 پیکسل (Badge،SentimentBadge،Avatar size="sm"). محتوای بزرگتر ردیفش را بلندتر میکند و ردیفهای جدول دیگر یک ارتفاع ندارند. کامپوننتهای سیستم طراحی وسطِ خط سلول قرار میگیرند، نه روی خط کرسی. جای دقیق محتوا 35 پیکسل است (درcompact27): 44 منهای 8 پیکسل فاصله و 1 پیکسل خط زیر ردیف. سلولهای آمادهٔ DataTable (SentimentCell،FlowCell، …) تراکم جدول را میخوانند و زیر این سقف میمانند. - سلولی که
Checkboxرا مستقیم در خود دارد (ستون انتخاب) فاصلهٔ انتهایی ندارد؛ سلولی که Checkbox را درون فرم یا برچسب دارد (مثل پنل ردیف بازشده) فاصلهاش را نگه میدارد. - تراکم مال خود جدول است. سلولها تراکم نزدیکترین
Tableرا میگیرند: جدولی که داخل سلول جدول دیگری است تراکم خودش را دارد، و هیچ عنصر بالادستی (PageContainer،Card، …) آن را عوض نمیکند. - برای استثنا،
classNameرویTableCellیاTableHeadفاصله یا اندازهٔ متن تراکم را جایگزین میکند (مثلاًpy-10برای ردیف «دادهای نیست»). - چرا 44: جدولهای فهرست سوپابیس 40 / حدود 52 با متن 13 Inter است. متن 14 یکانبخ از نظر دیداری هماندازهٔ 13 Inter است و خط بلندتری لازم دارد؛ 44 همان ریتم را بدون فاصلهٔ اضافه نگه میدارد. (تا 3٫x پیشفرض 32 / 31 با متن 12 بود: فشردهتر از سوپابیس، برعکسِ خواستهٔ محصول.)
sm،mdوlgاز 4.0 منسوخاند:sm←compact،mdوlg←default(در حالت توسعه یک بار هشدار میدهند). ظاهر 3٫x را تکرار نمیکنند:smدر 3٫x 32 / 31 / 12 بود،md40 / 39 / 14 وlg48 / 51 / 16 (برایlgمعادلی در 4.0 نیست).- جدولهای پژوهشی با 10 تا 12 ستون ممکن است تراکم سومی (حدود 32 / 32 / 12) لازم داشته باشند. هنوز در سیستم طراحی
نیست؛ تا تصمیم آن، از
compactاستفاده کنید و نیاز را به مسئول سیستم طراحی بگویید.
| نام | منشن | احساس | وضعیت | عملیات | |
|---|---|---|---|---|---|
ععلی احمدی | 1,284 | مثبت | فعال | ||
ممریم محمدی | 312 | منفی | غیرفعال | ||
| فقط متن | 98 | — | — | — |
| نام | احساس | جریان | خلاصهٔ احساس | تعامل | رشد |
|---|---|---|---|---|---|
| علی احمدی | مثبتخنثیمنفی | حامیمنتقد سازندهمخالف جدی | مثبتخنثیمنفی | 2.4٪ | +12نسبت به 7 روز قبل٪ |
| مریم محمدی | مثبتخنثیمنفی | حامیمنتقد سازندهمخالف جدی | مثبتخنثیمنفی | 1.2٪ | -8نسبت به 7 روز قبل٪ |
| نام | منشن | احساس | وضعیت | عملیات | |
|---|---|---|---|---|---|
ععلی احمدی | 1,284 | مثبت | فعال | ||
ممریم محمدی | 312 | منفی | غیرفعال | ||
| فقط متن | 98 | — | — | — |
| نام | احساس | جریان | خلاصهٔ احساس | تعامل | رشد |
|---|---|---|---|---|---|
| علی احمدی | مثبتخنثیمنفی | حامیمنتقد سازندهمخالف جدی | مثبتخنثیمنفی | 2.4٪ | +12نسبت به 7 روز قبل٪ |
| مریم محمدی | مثبتخنثیمنفی | حامیمنتقد سازندهمخالف جدی | مثبتخنثیمنفی | 1.2٪ | -8نسبت به 7 روز قبل٪ |
| نام | منشن |
|---|---|
| علی احمدی | 1,284 |
| مریم محمدی | 312 |
| جمع | 1,596 |
| نام | منشن | |||||
|---|---|---|---|---|---|---|
| علی احمدی | 1,284 | |||||
| ||||||
| مریم محمدی | 312 | |||||
با Caption
<Table>
<TableCaption>لیست سفارشات اخیر</TableCaption>
<TableHeader>...</TableHeader>
<TableBody>...</TableBody>
</Table>ردیفهای تعاملی (interactive)
با interactive روی TableRow، ردیف قابل کلیک و فوکوسپذیر با کیبورد میشود (Enter/Space فقط وقتی خودِ ردیف فوکوس است، تا دکمه/لینک داخل ردیف رفتار خودش را حفظ کند). برای جدولهای ساده که کلیک کل ردیف به یک صفحهٔ جزئیات میرود مناسب است.
<TableRow interactive onClick={() => router.push(`/campaigns/${row.id}`)}>
<TableCell>{row.name}</TableCell>
<TableCell>{row.platform}</TableCell>
</TableRow>هدر چسبان (stickyHeader)
با stickyHeader، هدر جدول هنگام اسکرول عمودی در بالای کانتینر میماند. چون هدر به نزدیکترین والدِ با overflow غیرقابلمشاهده میچسبد، خودِ کانتینر (data-slot="table-container") باید ارتفاع محدود داشته باشد؛ اگر containerClassName ندهید، بهصورت پیشفرض max-h-[28rem] overflow-y-auto اعمال میشود. برای ارتفاع دلخواه، containerClassName را بدهید:
<Table stickyHeader containerClassName="max-h-[24rem]">
<TableHeader>...</TableHeader>
<TableBody>...</TableBody>
</Table>محو لبه (edgeFade)
با edgeFade روی Table، یک شدو نرم روی لبهای که هنوز محتوای اسکرولنشده دارد ظاهر میشود (affordance به سبک Supabase). این ویژگی opt-in است (پیشفرض false) — تصمیمی تاریخی از نسخهی 2.1.0 تا ارتقا بدون رگرسیون بصری بماند و با مدل اسکرول DataTable تداخل نکند.
<Table edgeFade>
<TableHeader>...</TableHeader>
<TableBody>...</TableBody>
</Table>برای همین محو لبه در جایی خارج از جدول، ScrollArea با fade="inline" را به کار ببرید.
کامپوننتها
| کامپوننت | توضیح |
|---|---|
Table | المان <table> اصلی با overflow-x scroll |
TableHeader | المان <thead> |
TableBody | المان <tbody> |
TableRow | المان <tr> |
TableHead | المان <th> برای ستونهای هدر |
TableCell | المان <td> برای سلولهای داده |
TableCaption | المان <caption> برای عنوان جدول |
TableFooter | المان <tfoot> برای ردیفهای پاورقی |
TableSortHeader | دکمهٔ مرتبسازی ستون با prop sorted |
Props
Table
TableHeader / TableBody
همه className استاندارد را میپذیرند.
TableRow
TableHead
TableCell
TableCaption
TableSortHeader
راهنمای استفاده
بکنید
- از
Tableبرای نمایش دادههای ساختاریافته با ستونهای مشخص استفاده کنید - برای ستونهای قابل مرتبسازی ازTableSortHeaderبا propsortedاستفاده کنید (و در صورت نیازsortDirectionرا رویTableHeadبرای تنظیمaria-sortبگذارید) - تراکم پیشفرضdefault(40 / 44 / 14) است؛ فقط برای جدول پرتراکم منشنsize="compact"بدهید
نکنید
- از جدول برای نمایش محتوای غیردادهای (متن، گالری) استفاده نکنید - ستونهای غیرضروری اضافه نکنید — اطلاعات باید قابل
اسکن باشند - برای جداول با مرتبسازی، وضعیت
aria-sortرا درTableHeadفراموش نکنید -size="sm"،"md"یا"lg"ننویسید (منسوخاند) - در ردیفdefaultکنترلmdیا آواتار 40 پیکسلی، و در ردیفcompactکنترلsmنگذارید: ردیف بلندتر از بقیه میشود
دسترسیپذیری
- استفاده از المانهای معنادار HTML (
table,thead,tbody,th,td,caption) TableHeadازscope="col"پشتیبانی میکندTableCaptionبرای صفحهخوانها عنوان جدول را توصیف میکند
کامپوننتهای مرتبط
- DataTable — اگر نیاز به مرتبسازی، صفحهبندی یا انتخاب ردیف دارید، از DataTable استفاده کنید
- Pagination — برای افزودن صفحهبندی سفارشی به جداول ساده استفاده کنید
- StatDisplay — اگر داده شما key-value است و ساختار جدولی ندارد، از StatDisplay استفاده کنید