پرتوپرتو

تایپوگرافی

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

اصل

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


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

<p className="text-sm text-light">توضیح</p>
<p style={{ fontSize: '14px', color: '#888' }}>توضیح</p>
<h1 className="text-heading font-semibold">عنوان</h1>
<h1 className="tracking-widest">عنوان فارسی</h1>
formatNumber(1234567) // → "۱٬۲۳۴٬۵۶۷"
num.toString().replace(/\d/g, d => '۰۱۲۳۴۵۶۷۸۹'[d])
<a className="text-brand hover:text-brand-600">لینک</a>
<a className="underline">لینک</a> — آندرلاین با خط پیوسته فارسی تداخل دارد و در کل سیستم ممنوع است (قانون parto/no-text-underline)

فونت پیش‌فرض

پرتو از فونت یکان بخ 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 '@partodata/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)

پرتو یک مقیاس معنایی واحد دارد — شش utility که مستقیماً از توکن‌های --text-* در @theme ساخته می‌شوند. اندازه و line-height هر کدام یک‌جا و هماهنگ تعریف شده و line-height ها برای خوانایی فارسی کمی بازتر از پیش‌فرض لاتین تنظیم شده‌اند. کف خوانایی فارسی ۱۲px است (text-caption).

استثنای نمایش فشرده: دو توکن text-micro (۱۰px) و text-mini (۱۱px) صرفاً برای میکرولیبل‌های عددی/لاتینِ متراکم وجود دارند — شمارنده‌ی چیپ، مدت‌زمان ویدیو، برچسب محور نمودار. هرگز برای نثر فارسی استفاده نکنید؛ کف ۱۲px برای هر متن خواندنی برقرار است.

کلاساندازهline-heightکاربرد
text-caption12px1.5متادیتا، سرستون جدول (meta-label)، متن راهنما
text-label14px1.6label فرم، آیتم‌های nav ثانویه
text-body14px1.6متن بدنه‌ی پیش‌فرض
text-subheading16px1.5عنوان کارت، سرتیتر بخش
text-heading20px1.4عنوان صفحه، عنوان مودال
text-display24px1.3عنوان‌های نمایشی داک/مارکتینگ

فقط مقیاس نام‌دار

همیشه از همین شش نام استفاده کنید — نه text-xs/text-2xl خام و نه اندازه‌ی دلخواه مثل text-[18px]. مقیاس معنایی، تصمیمِ اندازه و فاصله‌ی خط را یک‌جا نگه می‌دارد و از سه مقیاس متناقض قبلی جلوگیری می‌کند.

نمونه بصری

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

text-label — برچسب فیلد فرم

text-body — متن اصلی و محتوای بدنه به زبان فارسی

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

text-heading — عنوان صفحه

text-display — عنوان نمایشی


وزن فونت

کلاسوزن عددیکاربرد
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-subheading font-medium">نام اینفلوئنسر</h3>
  <p className="text-lighter text-body mt-1">@username · ۱۲۵ هزار دنبال‌کننده</p>
</div>

MetricCard

اعداد متریک با text-stat (چهره‌ی جدا برای اعداد؛ ارقام tabular). برچسب با text-captionبدون uppercase و بدون tracking (هر دو خوانایی فارسی را خراب می‌کنند):

<div className="bg-surface-100 p-4 rounded-lg border border-default">
  <p className="text-lighter text-caption font-medium">نرخ تعامل</p>
  <p className="text-foreground text-stat mt-1">۳.۲٪</p>
  <p className="text-lighter text-caption mt-1">نسبت به ماه گذشته</p>
</div>
<div>
  <h1 className="text-foreground text-heading font-semibold">اینفلوئنسرها</h1>
  <p className="text-lighter text-body mt-1">۲۴۸ اینفلوئنسر در لیست شما</p>
</div>

Table

سرستون جدول از الگوی meta-label استفاده می‌کند: text-caption font-medium text-lighter — پاسخ مناسبِ فارسی به سرستون‌های mono/uppercase سوپابیس (بدون uppercase، بدون tracking). سلول‌ها اندازه‌شان را از تراکم خودِ Table (data-size) می‌گیرند.

<>
  {/* header — meta-label */}
  <th className="text-lighter text-caption font-medium text-start">نام کاربری</th>

  {/* cell اصلی — اندازه از data-size جدول */}
  <td className="text-foreground">@ali.ahmadi</td>

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

Alert / Toast

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

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

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

فارسی به فاصله خط بیشتری نسبت به انگلیسی نیاز دارد — حروف کشیده‌تر و نقطه‌ها بیشتر هستند. توکن‌های مقیاس معنایی این فاصله را از قبل در خود دارند (مثلاً text-body با line-height ۱٫۶)، پس معمولاً نیازی به leading-* دستی نیست:

// درست — line-height مناسب فارسی داخل خود توکن است
<p className="text-body">متن طولانی فارسی...</p>
<h2 className="text-heading font-semibold">عنوان</h2>

// فقط در موارد خاص که به فاصله‌ی متفاوت نیاز دارید، leading-* دستی اضافه کنید

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

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

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

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

شکستن خط

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

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

  • از text-lighter (نه text-muted) برای متن ثانویه‌ی خوانا مثل timestamp و متادیتا استفاده کنید؛ text-muted تیر faint و مخصوص حالت‌های غیرفعال است
  • هرگز بیش از ۳ اندازه متن در یک card نداشته باشید
  • اعداد متریک مهم را با text-stat نمایش دهید تا سریع خوانده شوند
  • در table، header با text-caption font-medium text-lighter (الگوی meta-label) و سلول‌ها با اندازه‌ی data-size جدول بهترین خوانایی را دارند