فضابندی
سیستم فضابندی پرتو — مقیاس 8pt، spacing tokens، و اصول فاصلهگذاری
اصول فضابندی
پرتو از یک مقیاس فضابندی مبتنی بر 8pt استفاده میکند. تمام مقادیر فاصله ضریبی از ۸ هستند (با استثنای ۴px برای موارد ظریف). این مقیاس از Tailwind CSS ارث میبرد.
4px → space-1
8px → space-2
12px → space-3
16px → space-4
24px → space-6
32px → space-8
40px → space-10
48px → space-12
64px → space-16نمونه بصری — مقیاس فضابندی
space-1 / 4px
فاصله خیلی کوچک — بین آیکون و متن
space-2 / 8px
فاصله پایه — gap بین badge ها
space-3 / 12px
فاصله کوچک — gap بین دکمهها
space-4 / 16px
فاصله متوسط — gap بین form field ها
space-6 / 24px
فاصله بزرگ — بین بخشهای card
space-8 / 32px
فاصله خیلی بزرگ — بین section ها
space-10 / 40px
فاصله page — padding card
space-12 / 48px
فاصله page padding
چرا 8pt Grid؟
- سازگار با اندازههای پیکسلی اکثر صفحهنمایشها (1x، 2x، 3x DPI)
- تصمیمگیری فضابندی را ساده میکند — همیشه از مقیاس استفاده کنید
- یکنواختی بصری در سراسر محصول
padding و margin
padding داخلی کامپوننتها
// padding کوچک — برای badge، tag
<span className="px-2 py-1">...</span>
// padding متوسط — برای button، input
<button className="px-4 py-2">...</button>
// padding بزرگ — برای card، section
<div className="p-6">...</div>
// padding خیلی بزرگ — برای page container
<main className="p-8 md:p-12">...</main>فاصله بین اجزا (gap)
// gap کوچک — بین badge ها و chip ها
<div className="flex gap-2">...</div>
// gap متوسط — بین button ها
<div className="flex gap-3">...</div>
// gap استاندارد — بین form field ها
<div className="flex flex-col gap-4">...</div>
// gap بزرگ — بین section ها
<div className="flex flex-col gap-8">...</div>CSS Logical Properties در فضابندی
چون پرتو RTL-first است، از CSS Logical Properties برای فضابندی جهتدار استفاده کنید:
// فضابندی جهتدار — RTL-safe
<div className="ps-4 pe-6"> {/* padding-inline-start / end */}
<div className="ms-2 me-4"> {/* margin-inline-start / end */}
<div className="border-s-2"> {/* border-inline-start */}
// نه این
<div className="pl-4 pr-6"> {/* physical — در RTL برعکس میشود */}فضابندی در Layout
ساختار صفحه داشبورد
<div className="flex flex-col gap-6 p-6">
{/* Header */}
<header className="flex items-center justify-between">
<h1 className="text-foreground text-2xl font-bold">داشبورد</h1>
<Button>اقدام</Button>
</header>
{/* Metrics Row */}
<div className="grid grid-cols-4 gap-4">
<MetricCard />
<MetricCard />
<MetricCard />
<MetricCard />
</div>
{/* Main Content */}
<div className="grid grid-cols-3 gap-6">
<div className="col-span-2">
<Card className="p-6">محتوا</Card>
</div>
<div>
<Card className="p-4">جانبی</Card>
</div>
</div>
</div>اندازههای استاندارد کامپوننت
| کامپوننت | padding توصیهشده |
|---|---|
| Badge | px-2 py-0.5 |
| Button small | px-3 py-1.5 |
| Button default | px-4 py-2 |
| Input | px-3 py-2 |
| Card | p-4 تا p-6 |
| Modal | p-6 |
| Page section | py-8 |
فضابندی متن
برای خوانایی بهتر متن فارسی:
// line-height مناسب برای فارسی
<p className="leading-relaxed">متن با فاصله خط مناسب</p>
// فاصله بین پاراگرافها
<div className="space-y-4">
<p>پاراگراف اول</p>
<p>پاراگراف دوم</p>
</div>
// heading با فاصله مناسب از محتوا
<div>
<h2 className="text-xl font-semibold mb-3">عنوان</h2>
<p className="text-light">محتوا</p>
</div>خلاصه قوانین
| قانون | مقدار |
|---|---|
| کوچکترین واحد | 4px (space-1) |
| واحد پایه | 8px (space-2) |
| gap بین inline elements | gap-2 یا gap-3 |
| gap بین block elements | gap-4 |
| gap بین section ها | gap-6 تا gap-8 |
| padding کارت | p-4 تا p-6 |
| padding page | p-6 تا p-8 |