پرتوپرتو

فضابندی

سیستم فضابندی پرتو — مقیاس 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 توصیه‌شده
Badgepx-2 py-0.5
Button smallpx-3 py-1.5
Button defaultpx-4 py-2
Inputpx-3 py-2
Cardp-4 تا p-6
Modalp-6
Page sectionpy-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 elementsgap-2 یا gap-3
gap بین block elementsgap-4
gap بین section هاgap-6 تا gap-8
padding کارتp-4 تا p-6
padding pagep-6 تا p-8