تایپوگرافی
مقیاس پیشفرض Tailwind برای متن لاتین تنظیم شده. حروف فارسی در همان اندازهٔ اسمی نوری کوچکتر دیده میشوند و کشیدگیها فاصلهٔ سطر بیشتری میخواهند، برای همین دیگ مقیاس خودش را دارد.
مقیاس
دو تفاوت با Tailwind: پلهٔ text-2xs تازه است، و text-sm از ۱۴px به ۱۳px آمده چون بدنهٔ واقعیِ رابطهای فارسی همین است. بقیهٔ پلهها دستنخوردهاند.
text-2xs۱۱pxدیگ، دیزاین سیستم فارسیریزنویسیِ جدول، شمارهٔ ردیف، متادیتای فرعیtext-xs۱۲pxدیگ، دیزاین سیستم فارسیلیبل، زیرنویس، بجtext-sm۱۳pxدیگ، دیزاین سیستم فارسیبدنهٔ رابط کاربری، پیشفرض فرم و جدولtext-base۱۶pxدیگ، دیزاین سیستم فارسیمتن خواندنی و پاراگرافِ مستنداتtext-lg۱۸pxدیگ، دیزاین سیستم فارسیتیتر کارت و بخشtext-xl۲۰pxدیگ، دیزاین سیستم فارسیتیتر صفحهtext-2xl۲۴pxدیگ، دیزاین سیستم فارسیتیتر بزرگtext-3xl۳۰pxدیگ، دیزاین سیستم فارسیتیتر صفحهٔ فرودتیترها با tracking-heading جمعتر میشوند (-0.01em)؛ در فارسی تیترِ درشت با فاصلهٔ حروفِ پیشفرض شل به نظر میرسد.
نقشها
پلههای بالا خاماند. در کد اینها را بنویسید، نه پله را: نقش میگوید «این متن چه کاره است»، و اگر فردا مقیاس عوض شود همهجا با هم عوض میشود. هر نقش با clamp بین موبایل و دسکتاپ سیّال است. لیبل و ریزنویسی عمداً سیّال نیستند، چون در جدول فشرده بزرگشدنشان با عرض صفحه چیدمان را بههم میریزد.
text-captionریزنویسیشمارهٔ ردیف، متادیتای فرعی، برچسب کلیدtext-labelلیبللیبل فرم، سرستون جدول، بجtext-descriptionتوضیحزیرنویسِ عنوان، راهنمای زیر فیلدtext-bodyبدنهمتن اصلی فرم و جدول و کارتtext-subheadingزیرعنوانعنوان گروه در فرمtext-headingعنوانتیتر کارت و بخشtext-titleتیتر صفحهتنها h1 هر صفحهtext-displayدرشتصفحهٔ فرود و حالت خالیِ بزرگفاصلهٔ دید در موبایل، دسکتاپ و تلویزیون
موبایل و دسکتاپ هر دو از فاصلهٔ بازو خوانده میشوند و تفاوتشان را خودِ clamp میگیرد. تلویزیون فرق دارد: از سه متری دیده میشود و همان ۱۳px ناخواناست، پس کل مقیاس باید بزرگ شود نه فقط تیترها.
این با عرض صفحه فعال نمیشود. وسوسهکننده است که بگوییم «۱۹۲۰ یعنی تلویزیون»، ولی ۱۹۲۰ رایجترین مانیتور دسکتاپ است و عرض چیزی دربارهٔ فاصلهٔ دید نمیگوید. پس یک پیچ صریح است که اپلیکیشن خودش میچرخاند، همان نقطهٔ اتصالِ آمادهٔ حالت «متن بزرگ» برای کاربر کمبینا.
:root { --font-scale: 1.35 } /* تلویزیون، فاصلهٔ سه متری */لنگر فونت: گذاشتنِ فونتِ پروژه
فونت هم مثل رنگ سه لایه دارد: پروژه فقط لنگر را عوض میکند، نه توکن معنایی را و نه زنجیرهٔ جایگزین را. یعنی ایرانسنس، وزیرمتن، ایرانیکان یا هر فونت دیگری، همه با یک خط.
import localFont from "next/font/local"
const iranSans = localFont({
variable: "--font-iransans",
display: "swap",
src: [
{ path: "./fonts/IRANSansXFaNum-Regular.ttf", weight: "400", style: "normal" },
{ path: "./fonts/IRANSansXFaNum-Medium.ttf", weight: "500", style: "normal" },
{ path: "./fonts/IRANSansXFaNum-DemiBold.ttf", weight: "600", style: "normal" },
{ path: "./fonts/IRANSansXFaNum-Bold.ttf", weight: "700", style: "normal" },
],
})
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="fa" dir="rtl" className={iranSans.variable}>
<body className="font-sans">{children}</body>
</html>
)
}/* تنها خطی که برای تعویض فونت عوض میشود */
:root {
--font-anchor: var(--font-iransans), "IRANSansX";
}فونت گوگلی هم همینطور است، کافی است متغیرِ next/font/google را به لنگر بدهید. توکنهای --font-sans و --font-mono و همهٔ کامپوننتها خودشان دنبال لنگر میآیند.
ارقام
هرجا عدد در ستون یا کنار هم مینشیند (جدول، مبلغ، ساعت) از tabular-nums استفاده کنید تا ارقام همعرض بمانند و ستون نلرزد. برای تبدیل رقم لاتین به فارسی، ابزارهای persian در دیگ آمادهاند.