پرتوپرتو

تایپوگرافی

سیستم تایپوگرافی پرتو — فونت یکان بخ Variable، مقیاس اندازه، وزن، و راهنمای استفاده

اصل

تایپوگرافی در پرتو یک انتخاب آگاهانه است، نه پیش‌فرض مرورگر. فارسی نیاز به فاصله خط بیشتر، letter-spacing صفر، و اعداد بومی دارد — این‌ها از روز اول در سیستم تنظیم شده‌اند. یکان بخ Variable تنها فونتی است که در پرتو استفاده می‌شود؛ فونت سفارشی اضافه نکنید.


قوانین اجباری

<p className="text-sm text-light">توضیح</p>
<p style={{ fontSize: '14px', color: '#888' }}>توضیح</p>
<h1 className="text-2xl font-bold leading-snug">عنوان</h1>
<h1 className="tracking-widest">عنوان فارسی</h1>
formatNumber(1234567) // → "۱٬۲۳۴٬۵۶۷"
num.toString().replace(/\d/g, d => '۰۱۲۳۴۵۶۷۸۹'[d])

فونت پیش‌فرض

پرتو از فونت یکان بخ Variable استفاده می‌کند — یک فونت متغیر فارسی که از وزن ۱۰۰ تا ۹۵۰ پشتیبانی می‌کند. این فونت به صورت پیش‌فرض در سیستم بارگذاری می‌شود و نیازی به تنظیم دستی ندارد.

کیک تازه با 123456 ریال - یی یی پی پژ

تنظیمات اصلی

48px
130%
400
چسبیده

ویژگی‌های OpenType

فاصله‌گذاری و ترکیب

اعداد

Stylistic Sets

font-variation-settings: "wght" 400, "DOTS" 0; font-feature-settings: "kern" 1, "liga" 1, "ss01" 0;

ویژگی‌های OpenType

اعداد فارسی — ss01

مهم‌ترین ویژگی: برای نمایش اعداد فارسی از OpenType استفاده کنید، نه JavaScript:

/* پرتو این را به صورت پیش‌فرض تنظیم کرده */
body {
  font-feature-settings: 'ss01' 1;
}
// این کد را ننویسید
const fa = num.toString().replace(/\d/g, (d) => '۰۱۲۳۴۵۶۷۸۹'[d])

// از utility پرتو استفاده کنید (فقط برای فرمت‌دهی، نه تبدیل)
import { formatNumber } from '@parto-system-design/ui'
formatNumber(1234567) // → "۱٬۲۳۴٬۵۶۷"

سایر ویژگی‌های فونت

font-variation-settings:
  'wght' 400,
  'DOTS' 0;
font-feature-settings:
  'kern' 1,
  'liga' 1,
  'ss01' 1;
ویژگیتوضیح
wght ۱۰۰–۹۵۰وزن فونت — محور متغیر اصلی
DOTS 0/1نقطه‌های حروف — چسبیده (0) یا جدا (1)
ss01اعداد فارسی
kernفاصله‌گذاری هوشمند بین حروف

مقیاس اندازه (Type Scale)

کلاس Tailwindاندازهکاربرد
text-xs12pxمتادیتا، timestamp، badge
text-sm14pxمتن توضیحی، label فرم، table cell
text-base16pxمتن بدنه، پاراگراف اصلی
text-lg18pxlead paragraph، توضیحات برجسته
text-xl20pxعنوان section، card title
text-2xl24pxعنوان صفحه فرعی
text-3xl30pxعنوان صفحه اصلی
text-4xl36pxhero title

نمونه بصری

text-xs — ۲ ساعت پیش · ۱۲۴۵ نمایش

text-sm — توضیح کوتاه و متن راهنما

text-base — متن اصلی و محتوای بدنه

text-lg — توضیح برجسته

text-xl — عنوان کارت

text-2xl — عنوان صفحه

text-3xl — عنوان اصلی


وزن فونت

کلاسوزن عددیکاربرد
font-normal400متن بدنه، توضیحات
font-medium500label، item فعال در nav
font-semibold600card title، section header
font-bold700page title، metric value

قانون ساده

  • متن بدنهfont-normal
  • عناوین درون محتواfont-semibold
  • عناوین صفحهfont-bold
  • اعداد متریکfont-bold با text-2xl یا بالاتر

ترکیب‌های رایج

Card

<div className="bg-surface-100 p-4 rounded-lg border border-default">
  <h3 className="text-foreground text-base font-semibold">نام اینفلوئنسر</h3>
  <p className="text-light text-sm mt-1">@username · ۱۲۵ هزار دنبال‌کننده</p>
</div>

MetricCard

<div className="bg-surface-100 p-4 rounded-lg border border-default">
  <p className="text-muted text-xs font-medium uppercase tracking-wide">نرخ تعامل</p>
  <p className="text-foreground text-3xl font-bold mt-1">۳.۲٪</p>
  <p className="text-light text-sm mt-1">نسبت به ماه گذشته</p>
</div>
<div>
  <h1 className="text-foreground text-2xl font-bold">اینفلوئنسرها</h1>
  <p className="text-light text-sm mt-1">۲۴۸ اینفلوئنسر در لیست شما</p>
</div>

Table

<>
  {/* header */}
  <th className="text-muted text-xs font-medium text-start">نام کاربری</th>

  {/* cell اصلی */}
  <td className="text-foreground text-sm">@ali.ahmadi</td>

  {/* cell ثانویه */}
  <td className="text-light text-sm">۴۵٬۲۰۰</td>
</>

Alert / Toast

<div>
  <p className="text-foreground text-sm font-medium">تغییرات ذخیره شد</p>
  <p className="text-light text-xs mt-0.5">کمپین «تابستان ۱۴۰۳» به‌روزرسانی شد</p>
</div>

راهنمای فارسی

فاصله خط (line-height)

فارسی به فاصله خط بیشتری نسبت به انگلیسی نیاز دارد — حروف کشیده‌تر و نقطه‌ها بیشتر هستند:

// برای متن بدنه — leading-relaxed (1.625)
<p className="text-base leading-relaxed">متن طولانی فارسی...</p>

// برای عناوین — leading-snug (1.375) کافی است
<h2 className="text-2xl font-bold leading-snug">عنوان</h2>

// پیش‌فرض Tailwind (leading-normal = 1.5) برای فارسی کمی تنگ است

فاصله بین حروف (letter-spacing)

در فارسی، letter-spacing مثبت خوانایی را کاهش می‌دهد:

// درست
<h1 className="tracking-normal">عنوان فارسی</h1>

// نادرست — حروف از هم فاصله می‌گیرند و زشت می‌شود
<h1 className="tracking-widest">عنوان فارسی</h1>

شکستن خط

/* برای جلوگیری از overflow در متن فارسی */
word-break: normal;
overflow-wrap: break-word;

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

  • از text-muted برای اطلاعات کم‌اهمیت (timestamp، متادیتا) استفاده کنید
  • هرگز بیش از ۳ اندازه متن در یک card نداشته باشید
  • اعداد متریک مهم را با font-bold و اندازه بزرگ نمایش دهید تا سریع خوانده شوند
  • در table، header با text-xs font-medium text-muted و cell با text-sm بهترین خوانایی را دارد