دیزاین سیستم مبانی

مبانی دیزاین

توکن‌ها کوچک‌ترین واحدهای سیستم‌اند: رنگ، قلم، فاصله، شعاع، سایه، آیکون و حرکت. هیچ مقدار خامی خارج از این توکن‌ها در کد محصول نباید ظاهر شود — نمونه‌های این صفحه با همان توکن‌ها رندر می‌شوند، پس با تغییر پوسته (دکمه خورشید/ماه بالا) همه‌چیز زنده عوض می‌شود.

۱رنگ‌ها

پالت از شش نقش ساخته شده: پس‌زمینه، سطح، متن، خط، برند و معنایی — به‌علاوه یک پالت ۸رنگی مقوله‌ای برای تقویم‌ها و رویدادها. هر توکن در پوسته تاریک معادل روشن‌شده خودش را دارد؛ کامپوننت‌ها هرگز رنگ خام نمی‌بینند.

برند — آبی واحد #2563EB

یک آبی واحد در کل محصول (وب و موبایل). آبی برند رنگ کنش است: دکمه اصلی، حالت فعال، لینک — و هیچ‌جای دیگری.

برند--brand · #2563EB
برند عمیق--brand-deep · #004AC6
ظرف برند--brand-container · ۱۱٪
متن روی ظرف--on-brand-container · #0B2E6B
برند — تاریک--brand · #8FB4FF

سطوح — نردبان پنج‌پله

بوم تا عمیق‌ترین سطح. جداسازی سطح‌ها با خط انجام می‌شود، نه سایه؛ سایه فقط برای لایه‌های شناور (§سایه).

بوم--bg
سطح ۰--surface
سطح ۱--surface-1
سطح ۲--surface-2
سطح ۳--surface-3
توکنروشنتاریککاربرد نمونه
--bg#FBFBFC#101318پشت صفحه اصلی و ستون‌های تقویم
--surface#FFFFFF#181C22کارت، دیالوگ، نوار بالا
--surface-1#F5F6F8#1F242Bهاور دکمه outline، زمینه فرم‌های داخل دیالوگ
--surface-2#EFEFF2#262B33هاور آیکون‌باتن، سلول‌های خالی ماه
--surface-3#E8E9ED#2E343Dسوییچ خاموش، ریل‌های عقب‌تر

متن و خط

متن اصلی--fg · #1B1E24
متن ثانویه--muted · #565D6A
متن کمکی--faint · #8A909C
خط--border
خط پررنگ--border-strong

رنگ‌های معنایی

قرمز تعطیلات با قرمز خطا عمداً متفاوت‌اند: تعطیلات داده تقویم است، خطا پیام سیستم.

تعطیلات--holiday · #D41317
خطا--error · #BA1A1A
هشدار--warn
موفقیت--ok
نقطه موفقیت--ok-dot
توکنروشنتاریکفقط کجا
--holiday#D41317#FF8A80روز جمعه و تعطیلات، تاریخ موعد گذشته، دکمه حذف
--error#BA1A1A#FFB4ABخطای اعتبارسنجی فرم، شکست عملیات
--warn + --warn-container#9A5B00#F5C064بنر تعارض همگام‌سازی، پیام‌های احتیاطی
--ok#067A57#8AD8B4وضعیت «انجام‌شده»، تأیید موفق

پالت مقوله‌ای تقویم‌ها — ۸ رنگ

هر تقویمِ کاربر یکی از این هشت رنگ را می‌گیرد؛ رویدادها، نقطه‌ها و چک‌باکس‌ها همه از رنگ تقویم والد رنگ می‌گیرند. در پوسته تاریک همین رنگ‌ها با color-mix روشن می‌شوند.

آبی--ev-1
سبز--ev-2
فیروزه‌ای--ev-3
کهربایی--ev-4
قرمز--ev-5
صورتی--ev-6
بنفش--ev-7
قهوه‌ای--ev-8

بایدر

  • آبی برند فقط برای اکشن اصلی و حالت فعال — در هر نما حداکثر یک دکمه پر.
  • قرمز تعطیلات فقط روی داده تقویم (روز، تاریخ، موعد) و دکمه حذف.
  • همه رنگ‌های جدید از توکن‌ها یا color-mix روی توکن‌ها ساخته می‌شوند.

نبایدر

  • هگز خام جدید در کامپوننت‌ها — پوسته تاریک را می‌شکند.
  • قرمز تعطیلات برای برچسب «جدید»، بج تخفیف یا دکوراسیون.
  • گرادیان روی سطوح بزرگ؛ سایه‌دادن به‌جای خط برای جداسازی کارت‌های درون‌صفحه.

۲تایپوگرافی

یک خانواده واحد: دانا (DanaFaNum). برای محصول داده‌محورِ راست‌چین، خانوادهٔ تک هم ساده‌تر است و هم رندر ارقام فارسی را در همه وزن‌ها یکدست نگه می‌دارد؛ تمایز سلسله‌مراتب با اندازه و وزن ساخته می‌شود، نه فونت دوم.

عنوان صفحه — مهر ۱۴۰۵
28 / 800 / 1.30
view h1 · docs h1
عنوان بخش و دیالوگ بزرگ
21 / 800 / 1.35
section h2
عنوان دیالوگ و کارت
17 / 700 / 1.35
.dialog-head h2
متن بدنه. تقویمم همه ارقام را فارسی نمایش می‌دهد: ۷ شهریور ۱۴۰۵، ساعت ۰۹:۳۰ تا ۱۱:۰۰.
15 / 400–500 / 1.65
body base
دکمه و برچسب فرم
14 / 600 / 1.00
.btn · label
متن رابط فشرده — تب، منو، توست
13.5 / 500 / 1.60
.tabpill · .menu · .toast
چیپ و برچسب کوچک
12.5 / 500 / 1.60
.chip
عدد روز و پیام خطای فیلد
12 / 500 / 1.60
.mday · .err
نشان و سرستون روزهای هفته
11 / 700 / 1.60
.badge · .wrow

قواعد ارقام فارسی

قاعدهمثال درستابزار
همه اعداد نمایشی فارسی‌اند۷ شهریور · ۰۹:۳۰ · ۱۵ رویدادJ.fa(n) — رقم‌فرد
اعداد دورقمی با صفر ابتدایی۰۹:۰۵J.fa2(n)
ورودی کاربر با رقم فارسی پذیرفته و نرمال می‌شود«۰۹۱۲…» → 0912…J.en(str)
اعداد جدولی (ساعت، شمارنده) هم‌عرض می‌مانند08:00 ← 09:00 ← 10:00کلاس .num (tabular-nums)
letter-spacing در متن فارسی هرگز افزایش نمی‌یابد
فونت وب: دانا به‌صورت محلی از پوشهٔ Dana/ لود می‌شود — woff2 با فالبک woff، وزن‌های ۴۰۰ تا ۸۰۰، تعریف‌شده در app.css و مصرف‌شده از --font با فالبک‌های Segoe UI / Tahoma / system-ui؛ نسخهٔ FaNum ارقام فارسی را در خود فونت تعبیه کرده است.

۳فاصله و شکل

واحد پایه ۴ پیکسل است؛ همه فاصله‌ها مضرب آن‌اند. عمق احساس فضا از فاصله می‌آید، نه از خط و سایه اضافه.

نردبان فاصله

4
8
12
16
20
24
32
44

۴ و ۸: داخل کامپوننت (گپ آیکون-متن) · ۱۲ و ۱۶: بین فیلدها و بخش‌ها · ۲۰ و ۲۴: پدینگ بدنه دیالوگ و کارت · ۳۲+: بین بخش‌های صفحه · ۴۴: حداقل هدف لمسی

شعاع گوشه‌ها

8 — r-sm
10 — فیلدها
12 — r-md
16 — r-lg
24 — r-xl
کامل — چیپ/تب
شعاعتوکنکجا
8--r-smآیتم منو، بلاک کد، سواچ
10فیلد ورودی، سلکت، جعبه OTP
12--r-mdدکمه، کارت، منو، توست (پیش‌فرض کامپوننت‌ها)
16--r-lgدیالوگ دسکتاپ
24--r-xlگوشه‌های بالای برگه پایین موبایل
کامل99pxچیپ، تب قرصی، نشان، دکمه آیکونی، روزهای تقویم

قاعده ترکیب: یک نما حداکثر سه شعاع متفاوت هم‌زمان نشان می‌دهد؛ نزدیک‌ترین شعاع به مقیاس نردبان رند می‌شود، مقدار سافارشی ساخته نمی‌شود.

۴سایه و عمق

عمق در تقویمم معنادار است: هرچیز «شناور روی صفحه» سایه دارد، هرچیز «داخل صفحه» با خط جدا می‌شود. سه سطح سایه + یک اسکریم:

سایه ۱ — هاور دکمه، کارت ساده
سایه ۲ — FAB، توست
سایه ۳ — منو، دیالوگ
اسکریم — پشت دیالوگ ۴۵٪ + بلور ۳

بایدر

  • سایه فقط وقتی عنصر روی محتوا شناور می‌شود (منو، دیالوگ، FAB، توست).
  • با بازشدن لایه شناور، پشت‌صحنه با اسکریم + بلور ملایم کم‌رنگ می‌شود.

نبایدر

  • سایه روی کارت‌های داخل صفحه — خط ۱px --border کافی است.
  • سایه‌های رنگی یا چندلایه نمایشی برای «جلب توجه».

۵آیکونوگرافی

آیکون‌ها SVG درون‌خطی‌اند با این قرارداد ثابت: شبکه ۲۴×۲۴، ضخامت خط ۱٫۸، انتهای گرد، بدون پرشدگی، رنگ از currentColor. هیچ‌وقت ایموجی جای آیکون رابط نمی‌نشیند (ایموجی فقط داده کاربر است — نام تقویم‌ها).

ماه — 24 (FAB و ریل)
نمای هفته — 20 (آیکون‌باتن)
ایجاد — 17 (داخل دکمه/منو)
بازشو — 16 (باتن کوچک)
اندازهکجا
24FAB، ریل ناوبری
20دکمه آیکونی استاندارد (40px)
17آیکون داخل دکمه متنی و آیتم منو
16دکمه آیکونی کوچک (30px) و متادیتای فشرده

همیشه width و height صریح روی SVG بنویسید — SVG بدون ابعاد درون چیدمان فلکس به ابعاد پیش‌فرض عناصر جایگزین باد می‌کند.

<!-- قرارداد آیکون -->
<svg viewBox="0 0 24 24" width="20" height="20"
     fill="none" stroke="currentColor" stroke-width="1.8"
     stroke-linecap="round" stroke-linejoin="round"></svg>

۶حرکت

حرکت باید کارِ رابط را توضیح دهد: از کجا آمد، کجا می‌رود. یک منحنی واحد برای همه:

مقدارکاربرد
--ease: cubic-bezier(.2,0,0,1)همه ترنزیشن‌ها — شتاب‌گیری سریع، فرود نرم (امضای MD3)
80–120ms · transformفشردن دکمه (translateY 1px)، مقیاس FAB
150–160ms · رنگ/خط/پس‌زمینههاور چیپ، دکمه، آیکون‌باتن
180–240ms · transform+opacityباز/بسته‌شدن دیالوگ (14px جابه‌جایی + محو)، توست، اسکریم
800ms · چرخش خطیاسپینر بارگذاری
حرکت کاهش‌یافته: app.css با prefers-reduced-motion همه انیمیشن‌ها را به ۰٫۰۱ms می‌رساند — کامپوننت‌های جدید نباید این را دور بزنند. فقط transform و opacity انیمیت می‌شوند؛ عرض/ارتفاع هرگز.

۷جهت و تقویم جلالی

این بخش تفاوت تقویمم با یک دیزاین‌سیستم عمومی است: راست‌چین بودن و تقویم جلالی جزو بنیادها هستند، نه تنظیمات منطقه‌ای.

راست‌چین اصیل

به‌جایبنویسچرا
margin-left / rightmargin-inline-start / endبا جهت سند خودکار برمی‌گردد
left / right (position)inset-inline-start / endمثل بالا
text-align: righttext-align: startپیش‌فرض RTL خودش درست است
آیکون جهت‌دار بدون قرینهقرینه در RTLفلش‌های «بعدی/قبلی» ماه باید به چپ/راست معنی درست بدهند
رقم و ساعت به‌ارث از جهت متن.ltr یا unicode-bidi هدفمند09:30 در جمله فارسی نباید به 30:09 برسد

شبکه هفته و تعطیلات

هفته از شنبه شروع می‌شود و سرستون‌ها ش ی د س چ پ ج است (آرایه J.WD_SHORT). جمعه همیشه قرمز است و روزهای تعطیل ثابت شمسی هم — با همان توکن --holiday.

شیدسچپج
۱۲۳۴۵۶۷ ۸۹۱۰۱۱۱۲۱۳۱۴

قرمز = جمعه/تعطیل · توپ آبی = امروز (پر برند) · حلقه = انتخاب‌شده — نمونه زنده کامپوننت شبکه ماه

تعطیلات ثابت شمسی

جدول J.HOLIDAYS این روزها را نگه می‌دارد (ماه-روز به حساب جلالی): ۱ تا ۴ فروردین (نوروز) · ۱۲ و ۱۳ فروردین (جمهوری اسلامی و طبیعت) · ۱۵ خرداد · ۱۳ آبان · ۲۲ بهمن · ۱۴ اسفند · ۲۹ اسفند (ملی شدن نفت). J.isHoliday(date) جمعه‌ها را هم شامل می‌شود.

API موتور جلالی

تابعخروجیمثال
J.dateToJ(date){jy, jm, jd}→ ۱۴۰۵/۶/۷
J.jToDate(j)Date میلادیبرای محاسبات و مقایسه
J.todayJ()امروز جلالیلنگر «امروز» در همه نماها
J.fmtJ(j) / fmtJMed / fmtJFullرشته تاریخ«۷ شهریور ۱۴۰۵» / «۷ شهریور» / «شنبه ۷ شهریور ۱۴۰۵»
J.isHoliday(j) · isFriday(j)booleanرنگ‌کردن روز و خط‌خوردن موعد
J.jDaysInMonth(jy, jm)۲۹/۳۰/۳۱ساخت شبکه ماه با کبیس دقیق
J.jAddDays(j, n) · cmpJ(a, b)جابه‌جایی / مقایسهرویدادهای چندروزه و مرتب‌سازی

سال کبیسی با الگوریتم ۳۳ساله محاسبه می‌شود و در برابر تاریخ‌های مرجع (مثل ۱ فروردین ۱۴۰۵ = 21 March 2026) تست شده است.