تایپوگرافی
سیستم تایپوگرافی پرتو — فونت یکان بخ 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 ریال - یی یی پی پژ
تنظیمات اصلی
ویژگیهای 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-caption | 12px | 1.5 | متادیتا، سرستون جدول (meta-label)، متن راهنما |
text-label | 14px | 1.6 | label فرم، آیتمهای nav ثانویه |
text-body | 14px | 1.6 | متن بدنهی پیشفرض |
text-subheading | 16px | 1.5 | عنوان کارت، سرتیتر بخش |
text-heading | 20px | 1.4 | عنوان صفحه، عنوان مودال |
text-display | 24px | 1.3 | عنوانهای نمایشی داک/مارکتینگ |
فقط مقیاس نامدار
همیشه از همین شش نام استفاده کنید — نه text-xs/text-2xl خام و نه اندازهی دلخواه مثل text-[18px]. مقیاس معنایی،
تصمیمِ اندازه و فاصلهی خط را یکجا نگه میدارد و از سه مقیاس متناقض قبلی جلوگیری میکند.
نمونه بصری
text-caption — ۲ ساعت پیش · ۱٬۲۴۵ نمایش
text-label — برچسب فیلد فرم
text-body — متن اصلی و محتوای بدنه به زبان فارسی
text-subheading — عنوان کارت
text-heading — عنوان صفحه
text-display — عنوان نمایشی
وزن فونت
| کلاس | وزن عددی | کاربرد |
|---|---|---|
font-normal | 400 | متن بدنه، توضیحات |
font-medium | 500 | label، item فعال در nav |
font-semibold | 600 | card title، section header |
font-bold | 700 | page 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>PageHeader
<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جدول بهترین خوانایی را دارند