# قواعد UI — هر صفحه و بخش جدید عیناً مطابق سیستم موجود **الزامی برای همهٔ تسک‌ها.** هیچ طراحی جدید، هیچ تم جدید، هیچ کامپوننت موازی. منبع حقیقت: کدِ موجود، نه سلیقه و نه `docs/admin-ui/ui-design-spec.md` (که draft قدیمی با پالت بنفش است و با کد شیپ‌شده نمی‌خواند). --- ## پنل ادمین `clinicpro` — React 19 + Webpack Encore + Tailwind v4 ### توکن‌ها — هرگز مقدار hard-code منبع: `assets/admin/styles.css`، بلوک `:root`. ```tsx // ❌
// ✅
``` | گروه | توکن | |---|---| | برند | `--primary` `#5559CE` · `--primary-600/700` · `--primary-soft/soft2` · `--on-primary` | | اکسنت | `--accent` `#f0682a` · `--accent-600` · `--accent-bg` | | سطوح | `--bg` `--bg-2` `--surface` `--surface-2/3` `--border` `--border-2` | | متن | `--text` `--text-2` `--text-3` | | وضعیت | `--success/-bg` `--warning/-bg` `--danger/-bg` `--info/-bg` `--violet/-bg` | | کارت آمار | `--stat-{amber,violet,green,pink}-{bg,fg}` | | شعاع | `--r-xs:7` `--r-sm:8` `--r:14` `--r-lg:18` `--r-xl:24` `--r-pill:999` | | سایه | `--shadow-sm` `--shadow` `--shadow-lg` | | چیدمان | `--sidebar-w:243` `--collapsed-w:90` `--topbar-h:64` `--gap:20` `--card-pad:22` `--row-h:56` | | حرکت | `--ease: cubic-bezier(.22,.61,.36,1)` | دارک‌مود با `[data-theme="dark"]` و حالت فشرده با `[data-density="compact"]` خودکار اعمال می‌شوند — **اگر** از توکن استفاده کرده باشی. مقدار hard-code در دارک‌مود می‌شکند. ### کامپوننت‌ها — اول جست‌وجو، بعد ساخت `assets/admin/components/ui/` این‌ها را دارد. ساختن نسخهٔ موازی از هر کدام **رد** می‌شود: ``` DataTable (مرتب‌سازی، جستجو، skeleton، empty state، bulk) · Modal · ConfirmDialog PageHeader (عنوان + breadcrumb + action + backTo) · BackButton · StatCard · StatusBadge Pagination · SearchableSelect · AppointmentStatusDropdown PersianDateInput / PersianDatePicker / PersianCalendar MobileInput · PriceInput · Portal · FeatureGate · Altcha ``` ### پنج قاعدهٔ غیرقابل‌مذاکره 1. **`SearchableSelect`، هرگز ` بومی نیست □ زیرصفحه‌ها backTo یا دارند □ وضعیت لیست (جستجو/فیلتر/صفحه) در URL است با useUrlState □ لیست‌ها از DataTable استفاده می‌کنند با skeleton و empty state فارسی □ هیچ کامپوننت موازیِ چیزی که در components/ui/ هست ساخته نشد □ همهٔ رشته‌ها فارسی و از i18n □ تاریخ‌ها شمسی با formatDate · مبالغ با formatRial □ RTL بررسی شد (ms/me نه ml/mr) □ موبایل بررسی شد (بدون اسکرول افقی) □ فرم‌ها با React Hook Form + Zod □ داده با TanStack Query و استخراج envelope درست □ خطاها با پیام فارسی از ErrorCodes نمایش داده می‌شوند ```