diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 9a93d3c..18c6348 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,311 +1,3 @@ -# 📋 تاریخچه تغییرات FrontOffice — کارا بازار سلامت +# Docs moved to totalDoc -> **آخرین بروزرسانی**: اسفند ۱۴۰۴ (فوریه ۲۰۲۶) -> **فریمورک**: Blazor Server + MudBlazor 8.14 + .NET 9 - ---- - -## 🔖 نسخه ۲.۷.۰ — اسفند ۱۴۰۴ (February 17, 2026) - -### ۱. اجبار تخفیف ۱۰۰٪ و حذف اسلایدر - -- **حذف** `MudSlider` و `MudNumericField` از `Checkout.razor` — کاربر دیگه درصد تخفیف انتخاب نمی‌کنه -- **حذف** کامل بخش نمایش موجودی اعتباری -- بکند همیشه حداکثر تخفیف (`MaxDiscountPercent`) رو اعمال می‌کنه - -### ۲. رفع متن Badge تخفیف - -- **مشکل:** Badge روی محصولات "۱۰۰٪ اعتباری" نشون می‌داد — گمراه‌کننده -- **رفع:** نمایش درصد واقعی محصول (مثلاً "۳۰٪ تخفیف") -- **فایل‌ها:** `Products.razor`, `Cart.razor`, `ProductDetail.razor` - -### ۳. نمایش جدول مالیات (VAT) در Checkout - -- جمع کل، تخفیف، مبلغ پس از تخفیف، مالیات ۹٪، مبلغ قابل پرداخت -- استفاده از `VatCalculator` برای محاسبه VAT - -### ۴. نمایش وضعیت پرداخت در سفارشات - -- **فیلد جدید** `payment_status` در proto `discountorder.proto` (v0.0.179) -- **صفحه Orders:** نمایش Chip رنگی بر اساس PaymentStatus (موفق/ناموفق/در انتظار) -- **صفحه OrderDetail:** Alert برای سفارشات ناموفق + دکمه بازگشت + جزئیات وضعیت -- **Helper متدها:** `GetPaymentStatusText()`, `GetPaymentStatusColor()`, `GetDeliveryStatusText()` - -### ۵. فیکس مپینگ PaymentStatus و DeliveryStatus - -- **مشکل:** Domain enum مقادیر متفاوتی از Proto داشت — مستقیم cast می‌شد -- **رفع:** `MapPaymentStatus()` و `MapDeliveryStatus()` در `DiscountOrderService.cs` (WebApi) -- سفارشات ناموفق حالا `DeliveryStatus=Cancelled` دارن (بجای "در حال پردازش") - -### ۶. فیکس Proto به NuGet v0.0.179 - -- `FrontOffice.Main.csproj`: `PackageReference` به `Foursat.CMSMicroservice.Protobuf` v0.0.179 - ---- - -## 🔖 نسخه ۲.۶.۰ — بهمن ۱۴۰۴ (February 16, 2026) - -### ۱. درگاه پرداخت زرین‌پال - -- **یکپارچه‌سازی ZarinPal** — پرداخت مستقیم بدون PYMS واسط -- صفحه checkout فروشگاه اعتباری: ریدایرکت به ZarinPal → callback → تأیید -- صفحه checkout فروشگاه عادی: همان جریان -- پشتیبانی از sandbox و production - -### ۲. جدول PaymentTransaction - -- **Entity جدید** `PaymentTransaction` — ذخیره جزئیات سطح درگاه (Authority, CardPan, CardHash, RefId) -- جدا از جدول Transaction اصلی -- Migration: `AddPaymentTransactionTable` - -### ۳. فیکس نمایش وضعیت پرداخت - -- **مشکل:** سفارشات اعتباری «در انتظار پرداخت» نشان می‌دادند حتی بعد از پرداخت موفق -- **علت:** Mapster نمی‌تونست `PaymentStatus` (enum) رو به `payment_completed` (bool) مپ کنه -- **رفع:** مپینگ دستی در `DiscountOrderService` - -### ۴. فیکس DeliveryStatus - -- **مشکل:** فروشگاه اعتباری بعد از پرداخت `InTransit` ست می‌کرد -- **رفع:** تغییر به `Pending` — ادمین باید وضعیت پست رو مشخص کنه - -### ۵. تغییر به NuGet Package (Docker build fix) - -- `ProjectReference` به CMS Protobuf → `PackageReference` (v0.0.178) -- Docker build context فقط `src/` داره → مسیر `../../../CMS` قابل دسترسی نیست - ---- - -## 🔖 نسخه ۲.۵.۰ — بهمن ۱۴۰۴ - -### ۱. محافظت صفحات نیازمند احراز هویت (Auth Guard) - -**فایل‌های تغییریافته:** -- `Shared/MainLayout.razor.cs` - -**شرح:** -قبلاً هیچ محافظتی در سطح مسیریابی وجود نداشت — کاربر غیرلاگین می‌توانست مستقیماً به `/profile/*`، `/commission/*`، `/cart` و... دسترسی پیدا کند. - -**تغییرات:** -- متد `EnforceAuthGuardAsync()` اضافه شد — در هر تغییر مسیر و اولین بار رندر اجرا می‌شود -- متد `IsProtectedRoute(path)` مسیرهای محافظت‌شده را تشخیص می‌دهد -- کاربر غیرلاگین → ریدایرکت به `/` (صفحه اصلی) - -**مسیرهای محافظت‌شده:** -| گروه | مسیرها | -|---|---| -| پروفایل | `/profile/*` | -| کمیسیون | `/commission/*` | -| شبکه | `/network/*` | -| باشگاه | `/club/*` | -| سبد خرید | `/cart`, `/checkout*`, `/orders`, `/order/*`, `/order-tracking/*` | -| پکیج‌ها | `/my-packages` | -| دروازه | `/my-orders`, `/my-cart` | -| فروشگاه اعتباری | `/discount-store/cart`, `/discount-store/checkout`, `/discount-store/orders`, `/discount-store/order/*` | - -**مسیرهای عمومی:** -`/`, `/register`, `/about`, `/faq`, `/contact`, `/blog/*`, `/packages`, `/package/*`, `/products`, `/product/*`, `/categories`, `/stores`, `/discount-store`, `/discount-store/product/*` - ---- - -### ۲. استخراج کامپوننت PhoneVerifyForm - -**فایل‌های جدید:** -- `Shared/PhoneVerifyForm.razor` -- `Shared/PhoneVerifyForm.razor.cs` - -**فایل‌های تغییریافته:** -- `Shared/AuthDialog.razor` -- `Shared/AuthDialog.razor.cs` - -**شرح:** -فرم تلفن + تایید OTP + کپچا که قبلاً به‌صورت `RenderFragment` با `__builder` مستقیم در `AuthDialog` نوشته شده بود، به کامپوننت مستقل `PhoneVerifyForm` استخراج شد. - -**ساختار قبل:** -``` -AuthDialog.razor - └── @code { PhoneOrVerifyContent() => __builder => { ... } } ← RenderFragment پیچیده -``` - -**ساختار بعد:** -``` -AuthDialog.razor - └── ← کامپوننت مستقل -PhoneVerifyForm.razor ← مارکاپ فرم -PhoneVerifyForm.razor.cs ← پارامترها و فرم رف‌ها -``` - -**پارامترهای PhoneVerifyForm:** - -| پارامتر | نوع | توضیح | -|---|---|---| -| `CurrentStep` | `AuthStep` | مرحله فعلی (Phone / Verify) | -| `PhoneRequest` | `CreateNewOtpTokenRequest` | مدل فرم تلفن | -| `VerifyRequest` | `VerifyOtpTokenRequest` | مدل فرم تایید | -| `CaptchaCode` | `string?` | کد کپچا نمایش‌داده‌شده | -| `CaptchaInput` / `CaptchaInputChanged` | `string?` + `EventCallback` | ورودی کپچا (two-way) | -| `OnRefreshCaptcha` | `EventCallback` | رفرش کپچا | -| `IsBusy` | `bool` | وضعیت بارگذاری | -| `ErrorMessage` / `InfoMessage` | `string?` | پیام‌های خطا/اطلاع | -| `PhoneNumber` | `string?` | شماره تایید‌شده | -| `ResendRemaining` | `int` | ثانیه تا ارسال مجدد | -| `OnChangePhone` / `OnResendOtp` | `EventCallback` | اکشن‌های تایید | - -**نکته مهم — Two-way binding کپچا:** -فیلد کپچا با `Value` + `ValueChanged` بایند شده (نه `@bind-Value`) تا مقدار تایپ‌شده از فرزند به والد برگردد: -```razor - -``` - -**دسترسی به فرم‌ها از والد:** -```csharp -// AuthDialog.razor.cs -var phoneForm = _phoneVerifyForm?.GetPhoneForm(); -var verifyForm = _phoneVerifyForm?.GetVerifyForm(); -``` - ---- - -### ۳. بهبود لایوت مدال ورود (AuthDialog) - -**فایل‌های تغییریافته:** -- `Shared/AuthDialog.razor` -- `Utilities/AuthDialogService.cs` -- `wwwroot/css/site.css` - -**مشکلات قبلی:** -- دیالوگ روی موبایل `FullScreen` بود → فضای خالی بزرگ بین فرم و دکمه‌ها -- `TitleContent` و `DialogActions` جدا → گپ عمودی -- ردیف کپچا با `MudStack Row="true"` → آیتم‌ها عمودی رندر می‌شدند - -**تغییرات:** -1. **حذف FullScreen**: `AuthDialogService` حالا همیشه `MaxWidth.ExtraSmall, FullWidth=true, CloseButton=true` -2. **ادغام محتوا**: آواتار + عنوان + فرم + دکمه‌ها همه داخل `DialogContent` → بدون `TitleContent` و `DialogActions` -3. **کلاس `auth-dialog-wrapper`**: CSS با `.auth-dialog-wrapper .mud-dialog-title { display: none; }` عنوان پیش‌فرض دیالوگ رو مخفی می‌کنه -4. **ردیف کپچا**: از `MudStack Row` به `div.captcha-row` با CSS flex اختصاصی -5. **حالت Inline**: بدون تغییر ساختاری — فقط از `PhoneVerifyForm` استفاده می‌کنه - -**CSS جدید:** -```css -.auth-dialog-wrapper .mud-dialog-title { display: none; } -.auth-dialog-wrapper .mud-dialog-content { padding-bottom: 24px !important; } -.auth-dialog-content { max-width: 400px; margin: 0 auto; } - -.captcha-row { display: flex; align-items: center; gap: 10px; } -.captcha-row > .mud-input-control { flex: 1 1 0; min-width: 0; } -.captcha-row > .mud-paper { flex: 0 0 auto; } -.captcha-row > .mud-button-root { flex: 0 0 auto; } -``` - ---- - -### ۴. صفحه لندینگ — حذف /pricing و اضافه بنر بلاگ - -**فایل‌های تغییریافته:** -- `Pages/Index.razor` -- `wwwroot/css/site.css` - -**تغییرات:** -1. دکمه هیرو «مشاهده پکیج‌ها» → **«آخرین اخبار»** با لینک `/blog` -2. **بنر جدیدترین مطلب** بین هیرو و «سه گام تا شروع» اضافه شد - - تصویر بندانگشتی + عنوان + خلاصه + آیکون شیشه‌ای - - هاور: `translateY(-2px)` + سایه بزرگ‌تر - -**CSS جدید:** -```css -.landing-blog-banner { border: 1px solid var(--mud-palette-divider); transition: ... } -.landing-blog-banner:hover { box-shadow: var(--mud-elevation-4); transform: translateY(-2px); } -.landing-blog-thumb { width: 80px; height: 80px; border-radius: 12px; } -.landing-blog-title { -webkit-line-clamp: 1; font-weight: 600; } -.landing-blog-summary { -webkit-line-clamp: 1; } -``` - ---- - -### ۵. افزایش ارتفاع تکست‌باکس‌ها (Global) - -**فایل تغییریافته:** -- `wwwroot/css/site.css` - -**قبل:** `padding: 10px 14px` -**بعد:** `padding: 14px 14px` + `font-size: 1rem` - -```css -.mud-input-outlined .mud-input-slot { - padding: 14px 14px !important; - font-size: 1rem; -} -``` - -تمام فیلدهای Outlined در کل اپلیکیشن بزرگ‌تر شدند. - ---- - -### ۶. اصلاح RTL فیلدهای ورودی - -**فایل تغییریافته:** -- `wwwroot/css/site.css` - -**مشکل:** فیلدهای `type="tel"` به‌صورت پیش‌فرض مرورگر `direction: ltr` می‌گیرن — لیبل سمت راست ولی placeholder/cursor سمت چپ. - -**اصلاح:** -```css -.mud-input-slot input, -.mud-input-slot textarea { - direction: rtl !important; - text-align: right !important; -} -``` - ---- - -### ۷. اصلاح captcha-box CSS - -**فایل تغییریافته:** -- `wwwroot/css/site.css` - -**قبل:** -```css -.captcha-box { - min-width: 120px; min-height: 56px; - background: linear-gradient(135deg, rgba(123,97,255,.12), rgba(255,140,189,.12)); -} -``` - -**بعد:** -```css -.captcha-box { - min-width: 96px; min-height: 48px; - border-radius: var(--mud-default-borderradius); - background: rgba(99,102,241,.08); - border: 1px solid var(--mud-palette-divider); -} -``` - ---- - -## 📁 نقشه فایل‌ها - -``` -Shared/ -├── AuthDialog.razor ← بازنویسی (کامپوننت PhoneVerifyForm جایگزین RenderFragment) -├── AuthDialog.razor.cs ← بروزرسانی (استفاده از _phoneVerifyForm) -├── PhoneVerifyForm.razor ← ✨ جدید (فرم تلفن + تایید + کپچا) -├── PhoneVerifyForm.razor.cs ← ✨ جدید (پارامترها و فرم رف‌ها) -├── MainLayout.razor.cs ← Auth Guard اضافه شد -Pages/ -├── Index.razor ← /pricing → /blog + بنر بلاگ -Utilities/ -├── AuthDialogService.cs ← حذف FullScreen، ثابت‌سازی سایز -wwwroot/css/ -├── site.css ← captcha-row, auth-dialog, RTL fix, input height -``` - ---- - -## 🔍 وضعیت بیلد - -| تاریخ | خطا | هشدار | توضیح | -|---|---|---|---| -| بهمن ۱۴۰۴ | **۰** | ۱۰۵ | MUD0002 warnings (بی‌خطر — مربوط به MudBlazor analyzer) | +See [totalDoc/INDEX.md](../../totalDoc/INDEX.md) for all documentation. diff --git a/docs/UI-UNIFICATION-PLAN.md b/docs/UI-UNIFICATION-PLAN.md index e43f290..18c6348 100644 --- a/docs/UI-UNIFICATION-PLAN.md +++ b/docs/UI-UNIFICATION-PLAN.md @@ -1,542 +1,3 @@ -# 🎨 پلن جامع یکپارچه‌سازی UI/UX — کارا بازار سلامت +# Docs moved to totalDoc -> **تاریخ**: بهمن ۱۴۰۴ -> **وضعیت**: ✅ **تمام ۶ فاز + فاز ۷ (ناوبری و امنیت) تکمیل شد** -> **هدف**: یکپارچه‌سازی طراحی FrontOffice با ۲۰٪ تغییر UX و ۵۰٪ تغییر UI -> **فریمورک**: Blazor Server + MudBlazor 8.14 -> **📋 تاریخچه تغییرات جزئی**: [CHANGELOG.md](CHANGELOG.md) - ---- - -## 📊 خلاصه اجرایی - -| شاخص | وضعیت قبل | وضعیت بعد | -|---|---|---| -| **صفحات کل** | ۴۱ صفحه + ۶ کامپوننت مشترک | ۴۱ صفحه + ۸ کامپوننت مشترک | -| **الگوی PageHeader** | ۱۹ صفحه از ۴۱ | ۳۲+ صفحه ✅ | -| **Inline Style سنگین** | ۱۱ صفحه 🔴 | ≤۲ صفحه (فقط gradient‌های تزئینی) ✅ | -| **Loading State** | ۲ الگوی متفاوت (Circular vs Linear) | `` واحد ✅ | -| **Empty State** | ۴+ الگوی متناقض | `` واحد ✅ | -| **Container Spacing** | ۶ الگوی متناقض | `py-6` استاندارد ✅ | -| **رنگ‌بندی** | رنگ‌های hardcoded در ۸+ صفحه | CSS Variable ✅ | -| **تم پالت** | Primary `#0380C0` (آبی ساده) | Indigo `#6366f1` + Full PaletteDark ✅ | -| **Elevation** | مخلوط ۲/۳/۴ | استاندارد ۰–۲ ✅ | -| **Build** | ۰ خطا | ۰ خطا ✅ | - -### فازها -| فاز | عنوان | وضعیت | -|---|---|---| -| ۱ | زیرساخت دیزاین سیستم | ✅ تکمیل | -| ۲ | صفحات پروفایل | ✅ تکمیل | -| ۳ | صفحات تخصصی | ✅ تکمیل | -| ۴ | بهبود بصری فروشگاه | ✅ تکمیل | -| ۵ | صفحات عمومی | ✅ تکمیل | -| ۶ | پالیش و تست | ✅ تکمیل | -| ۷ | ناوبری، امنیت و بازسازی کامپوننت‌ها | ✅ تکمیل | - ---- - -## 🔍 بخش ۱: تحلیل ضعف‌های جاری - -### ۱.۱ ناسازگاری‌های ساختاری (Structural) - -#### ❌ ۱.۱.۱ — PageHeader دوگانه -**مشکل**: نیمی از صفحات از `` استفاده می‌کنند، نیم دیگر header دستی دارند. - -| از `` استفاده می‌کنند ✅ | Header دستی دارند ❌ | -|---|---| -| Store/* (۸ صفحه) | Profile/* (۷ صفحه) | -| DiscountStore/* (۶ صفحه) | Club/* (۲ صفحه) | -| Gateway/* (۳ صفحه) | Commission/* (۲ صفحه) | -| Package/* (۲ صفحه) | Network/* (۱ صفحه) | -| PackageDetail, Checkout | Blog/*, Index, About, Contact, FAQ | - -**تأثیر**: ظاهر متفاوت دکمه بازگشت، فاصله‌بندی ناهماهنگ - -#### ❌ ۱.۱.۲ — Container MaxWidth متناقض -``` -MaxWidth.Large → اکثر صفحات -MaxWidth.Medium → Personal, Settings, OrderTracking, Blog/Post, Gateway/* -MaxWidth.Small → ChangePassword -ترکیبی (loading≠content) → OrderDetail, ProductDetail, PackageDetail -``` - -**تأثیر**: برخی صفحات پهن‌تر از حد نیاز هستند (مثلاً فرم‌های ساده با Large) - -#### ❌ ۱.۱.۳ — Container Padding متناقض -``` -py-6 → اکثریت (استاندارد) -py-8 → Package/Packages, Package/MyPackages -pa-2 pa-md-6 → Store/Products, DiscountStore/Products -py-6 py-md-10 → Gateway/* -py-4 py-md-6 → DiscountStore/ProductDetail -py-16 سکشنی → Index, About, Contact, FAQ -``` - -**قاعده پیشنهادی**: `py-6` برای صفحات داخلی، section-based برای صفحات عمومی - ---- - -### ۱.۲ ناسازگاری‌های بصری (Visual) - -#### ❌ ۱.۲.۱ — Inline Style سنگین (۱۱ صفحه) - -| صفحه | نمونه مشکل‌دار | -|---|---| -| **Index.razor** | `Style="color:#fff; font-size:clamp(1.6rem,4.5vw,2.4rem);"` | -| **Profile/Index** | `Style="background:rgba(99,102,241,.12);"` | -| **Store/ProductDetail** | `style="width:100%;height:360px;background-image:url(...);"` | -| **PackageDetail** | `Style="background: radial-gradient(600px 280px..."` | -| **Checkout** | `Style="background: radial-gradient(..."` + `Elevation="4"` | -| **Blog/Index** | `Style="color:#fff; font-weight:700;"`, `Style="font-size:3.5rem;"` | -| **Blog/Post** | `Style="width:100%; height:100%;"`, `Style="font-size:4rem;"` | -| **About** | `Style="background: radial-gradient(...);"` | -| **WeeklyBalance** | `Style="background: linear-gradient(135deg, #e8f5e9..."` | -| **Gateway/**** | `Style="background:rgba(16,185,129,.12)..."`, `Style="color:#10b981;"` | -| **DiscountStore/ProductDetail** | `Style="background:rgba(16,185,129,.06)..."` | - -#### ❌ ۱.۲.۲ — رنگ‌های Hardcoded - -| رنگ | استفاده | باید باشد | -|---|---|---| -| `#10b981` | Gateway (سبز فروشگاه) | `var(--ds-color-store)` | -| `#ef4444` | Gateway (قرمز اعتباری) | `var(--ds-color-discount)` | -| `#6366f1`, `#818cf8`, `#a78bfa` | Hero/Banner gradients | `var(--ds-gradient-primary)` | -| `rgba(99,102,241,.12)` | Dashboard backgrounds | `var(--ds-primary-soft)` | -| `rgba(16,185,129,.06)` | Discount product highlights | `var(--ds-success-soft)` | -| `#e8f5e9`, `#c8e6c9` | WeeklyBalance stat cards | `var(--ds-success-gradient)` | - -#### ❌ ۱.۲.۳ — Elevation ناهماهنگ -``` -Elevation="0" → Blog cards (با border) -Elevation="1" → برخی صفحات -Elevation="2" → اکثر صفحات (استاندارد) -Elevation="3" → WeeklyBalance stat cards -Elevation="4" → Checkout.razor -``` - -**قاعده پیشنهادی**: `Elevation="0"` با `border` = کارت‌های اطلاعاتی، `Elevation="2"` = default - -#### ❌ ۱.۲.۴ — Paper Rounding ناهماهنگ -``` -rounded-lg (16px) → اکثریت -rounded-xl (20px) → Index, Profile/Index, Gateway, DiscountStore/ProductDetail -بدون class → design system !important → 12px -``` - ---- - -### ۱.۳ ناسازگاری‌های UX (تجربه کاربری) - -#### ❌ ۱.۳.۱ — Loading State دوگانه -``` -MudProgressCircular → Store/*, DiscountStore/*, Package/*, About, Blog, Addresses -MudProgressLinear → Club/*, Commission/*, Network/*, RegisterWizard -``` - -**مشکل**: کاربر دو تجربه مختلف «در حال بارگذاری» می‌بیند - -#### ❌ ۱.۳.۲ — Empty State ناهماهنگ -``` -MudAlert Severity.Info → Store/Orders, Categories, DiscountStore/Orders -Icon + Text + Button → Addresses, Package/MyPackages, PackageDetail -MudAlert Severity.Warning → WithdrawalRequests -Custom dashed-border paper → Blog/Index -``` - -#### ❌ ۱.۳.۳ — Routing Directive ناهماهنگ -``` -@attribute [Route(RouteConstants...)] → ۳۹ صفحه ✅ -@page "/categories" → Categories.razor ❌ -@page "/blog/{Slug}" → Blog/Post.razor ❌ -``` - -#### ❌ ۱.۳.۴ — PackageDetail Loading/Error بدون Container -Loading و Error state در `PackageDetail.razor` بدون `MudContainer` رندر می‌شوند → محتوا تمام‌عرض نمایش می‌یابد. - -#### ❌ ۱.۳.۵ — تم فعلی کم‌رنگ -```csharp -// CustomMudTheme.cs فعلی -Primary = "#0380C0" // آبی ساده -// بدون Secondary، Tertiary، Info، Warning تعریف‌شده -// بدون PaletteDark -// بدون LayoutProperties -``` - -**مشکلات**: -- فقط Primary تعریف شده، بقیه رنگ‌ها default MudBlazor -- Dark mode بدون palette اختصاصی -- بدون `DefaultBorderRadius`، `AppbarHeight` و غیره -- تناقض بین Primary `#0380C0` و gradient‌های CSS با `#6366f1` - ---- - -## 🎯 بخش ۲: معماری دیزاین سیستم هدف - -### ۲.۱ سلسله‌مراتب صفحات - -``` -┌─────────────────────────────────────────────┐ -│ MainLayout │ -│ ├─ AppBar (fixed, transparent) │ -│ ├─ MudMainContent │ -│ │ ├─ [Public Pages] → Section-based │ -│ │ │ (Index, About, Contact, FAQ, Blog) │ -│ │ └─ [Internal Pages] → Container-based │ -│ │ ├─ │ -│ │ ├─ Content (MudStack/MudGrid) │ -│ │ └─ │ -│ ├─ Footer (hidden on mobile) │ -│ └─ BottomNav (mobile only) │ -└─────────────────────────────────────────────┘ -``` - -### ۲.۲ قواعد واحد (Single Source of Truth) - -| قاعده | مقدار | -|---|---| -| **Container MaxWidth** | `Large` = لیست/گرید, `Medium` = فرم/جزئیات, `Small` = تک‌فرم ساده | -| **Container Spacing** | `py-6` صفحات داخلی, section-based صفحات عمومی | -| **Paper Elevation** | `0` با border = کارت اطلاعاتی, `2` = default | -| **Paper Rounding** | `rounded-lg` = default, `rounded-xl` = hero/banner | -| **Loading State** | `` component واحد | -| **Empty State** | `` component واحد | -| **Page Header** | `` در تمام صفحات داخلی | -| **Content Wrapper** | `MudStack Spacing="3"` بعد از PageHeader | - -### ۲.۳ CSS Variables هدف - -```css -:root { - /* ── Brand Colors ── */ - --ds-brand-primary: #6366f1; /* Indigo — هویت اصلی */ - --ds-brand-secondary: #8b5cf6; /* Purple */ - --ds-brand-accent: #a78bfa; /* Light purple */ - - /* ── Semantic Colors ── */ - --ds-color-store: #10b981; /* فروشگاه عادی */ - --ds-color-discount: #ef4444; /* فروشگاه اعتباری */ - --ds-color-success: #10b981; - --ds-color-warning: #f59e0b; - --ds-color-error: #ef4444; - --ds-color-info: #3b82f6; - - /* ── Soft Backgrounds ── */ - --ds-primary-soft: rgba(99,102,241,.08); - --ds-success-soft: rgba(16,185,129,.08); - --ds-error-soft: rgba(239,68,68,.08); - --ds-warning-soft: rgba(245,158,11,.08); - - /* ── Gradients ── */ - --ds-gradient-primary: linear-gradient(135deg, #6366f1 0%, #818cf8 50%, #a78bfa 100%); - --ds-gradient-store: linear-gradient(135deg, #10b981 0%, #34d399 100%); - --ds-gradient-discount: linear-gradient(135deg, #ef4444 0%, #f97316 50%, #f59e0b 100%); - --ds-gradient-success: linear-gradient(135deg, #d1fae5 0%, #a7f3d0 100%); - - /* ── Spacing (existing) ── */ - --ds-radius-sm: 8px; - --ds-radius-md: 12px; - --ds-radius-lg: 16px; - --ds-radius-xl: 20px; - --ds-transition: 0.2s ease; - --ds-shadow-sm: 0 1px 3px rgba(0,0,0,.06); - --ds-shadow-md: 0 4px 12px rgba(0,0,0,.08); - --ds-shadow-lg: 0 8px 24px rgba(0,0,0,.10); -} -``` - ---- - -## 🚀 بخش ۳: فازبندی اجرا - -### 🔷 فاز ۱ — زیرساخت دیزاین سیستم (UI ~15%) -> **اولویت**: بالا | **ریسک**: پایین | **حجم**: ۶ فایل - -| # | تسک | فایل | نوع تغییر | -|---|---|---|---| -| 1.1 | ارتقاء `CustomMudTheme.cs` — اضافه کردن PaletteDark، LayoutProperties، رنگ‌های Secondary/Tertiary/Info، تغییر Primary به `#6366f1` | `CustomMudTheme.cs` | UI | -| 1.2 | توسعه CSS Variables — اضافه کردن brand colors، semantic colors، soft backgrounds، gradients | `site.css` | UI | -| 1.3 | ساخت `` component واحد | `Shared/LoadingState.razor` (جدید) | UX | -| 1.4 | ساخت `` component واحد | `Shared/EmptyState.razor` (جدید) | UX | -| 1.5 | بهبود `` — اضافه کردن آیکون، subtitle اختیاری | `Shared/PageHeader.razor` | UI | -| 1.6 | اضافه کردن `.page-container` CSS pattern | `site.css` | UI | - ---- - -### 🔷 فاز ۲ — یکپارچه‌سازی صفحات Profile (UI ~10%, UX ~5%) -> **اولویت**: بالا | **ریسک**: پایین | **حجم**: ۹ فایل - -| # | تسک | تغییرات | -|---|---|---| -| 2.1 | `Profile/Personal` → جایگزینی header دستی با `` | UX | -| 2.2 | `Profile/Addresses` → `` + `` + `` | UX | -| 2.3 | `Profile/Wallet` → `` | UX | -| 2.4 | `Profile/Settings` → `` | UX | -| 2.5 | `Profile/Tree` → `` | UX | -| 2.6 | `Profile/WithdrawalRequests` → `` + `` | UX | -| 2.7 | `Profile/ChangePassword` → `` | UX | -| 2.8 | `Profile/Index` (Dashboard) → حذف inline styles، استفاده از CSS Variables | UI | -| 2.9 | `Club/MembershipPage` + `Club/FeaturesPage` → `` + `` | UX | - ---- - -### 🔷 فاز ۳ — یکپارچه‌سازی صفحات تخصصی (UI ~5%, UX ~5%) -> **اولویت**: متوسط | **ریسک**: پایین | **حجم**: ۵ فایل - -| # | تسک | تغییرات | -|---|---|---| -| 3.1 | `Commission/Dashboard` → `` + `` | UX | -| 3.2 | `Commission/WeeklyBalance` → `` + حذف inline gradient styles | UI + UX | -| 3.3 | `Network/NetworkStatistics` → `` + `` | UX | -| 3.4 | `PackageDetail` → wrap loading/error در `MudContainer` | UX bug fix | -| 3.5 | `Checkout` → Elevation=4→2، حذف inline radial-gradient | UI | - ---- - -### 🔷 فاز ۴ — بهبود بصری فروشگاه‌ها (UI ~10%) -> **اولویت**: متوسط | **ریسک**: پایین | **حجم**: ۶ فایل - -| # | تسک | تغییرات | -|---|---|---| -| 4.1 | `Store/Products` → حذف inline hero styles، استفاده از CSS class | UI | -| 4.2 | `Store/ProductDetail` → حذف inline image styles، ساخت `.product-image-main` CSS | UI | -| 4.3 | `DiscountStore/ProductDetail` → حذف hardcoded rgba، استفاده از `--ds-success-soft` | UI | -| 4.4 | `Gateway/*` (۳ صفحه) → حذف hardcoded `#10b981`/`#ef4444`، استفاده از `--ds-color-store`/`--ds-color-discount` | UI | -| 4.5 | یکسان‌سازی Elevation → `0` با border یا `2` | UI | -| 4.6 | یکسان‌سازی Container spacing → `py-6` | UI | - ---- - -### 🔷 فاز ۵ — بهبود صفحات عمومی و بلاگ (UI ~10%) -> **اولویت**: پایین | **ریسک**: پایین | **حجم**: ۷ فایل - -| # | تسک | تغییرات | -|---|---|---| -| 5.1 | `Index.razor` → حذف inline styles از hero، استفاده از CSS class | UI | -| 5.2 | `About.razor` → حذف inline radial-gradient | UI | -| 5.3 | `Contact.razor` → cleanup minor inline styles | UI | -| 5.4 | `FAQ.razor` → cleanup minor inline styles | UI | -| 5.5 | `Blog/Index` → حذف inline hero styles، استفاده از CSS class | UI | -| 5.6 | `Blog/Post` → حذف inline styles از hero image و typography | UI | -| 5.7 | `RegisterWizard` → بهینه‌سازی wizard-section dark mode | UI | - ---- - -### 🔷 فاز ۶ — Polish نهایی و فرآیندی (UX ~10%) -> **اولویت**: پایین | **ریسک**: بسیار پایین | **حجم**: ۴ فایل + تست - -| # | تسک | تغییرات | -|---|---|---| -| 6.1 | Fix routing inconsistency — Categories + Blog/Post | UX | -| 6.2 | MudSnackbar notifications styling | UI | -| 6.3 | Dialog styling consistency (AuthDialog, AddressDialogs) | UI | -| 6.4 | Micro-interactions — button press, card hover, page transition | UI | -| 6.5 | تست کامل Dark Mode در تمام صفحات | UI + QA | -| 6.6 | تست Mobile Responsive در تمام صفحات | UX + QA | - ---- - -## 📈 بخش ۴: جدول تأثیرگذاری - -### تأثیر UI (هدف ~۵۰٪ تغییر) - -| حوزه | تعداد فایل | درصد تأثیر | -|---|---|---| -| Theme + CSS Variables | ۲ | ۱۵% (تأثیر سراسری) | -| حذف Inline Styles | ۱۱ | ۱۵% | -| یکسان‌سازی Elevation/Rounding | ۲۰+ | ۱۰% | -| بهبود رنگ‌بندی (CSS Variables) | ۸ | ۵% | -| Micro-interactions | سراسری | ۵% | -| **جمع** | | **~۵۰%** | - -### تأثیر UX (هدف ~۲۰٪ تغییر) - -| حوزه | تعداد فایل | درصد تأثیر | -|---|---|---| -| PageHeader یکپارچه | ۱۲ صفحه | ۸% | -| LoadingState واحد | ۱۵+ صفحه | ۴% | -| EmptyState واحد | ۸+ صفحه | ۳% | -| Container fixes (PackageDetail) | ۲ | ۲% | -| Routing consistency | ۲ | ۱% | -| Flow improvements | ۲ | ۲% | -| **جمع** | | **~۲۰%** | - ---- - -## 🔧 بخش ۵: مشخصات فنی کامپوننت‌های جدید - -### ۵.۱ LoadingState Component - -```razor -@* Shared/LoadingState.razor *@ - - - @if (!string.IsNullOrWhiteSpace(Message)) - { - @Message - } - - -@code { - [Parameter] public string Message { get; set; } = "در حال بارگذاری..."; -} -``` - -### ۵.۲ EmptyState Component - -```razor -@* Shared/EmptyState.razor *@ - - - @Title - @if (!string.IsNullOrWhiteSpace(Description)) - { - - @Description - - } - @if (!string.IsNullOrWhiteSpace(ActionText)) - { - - @ActionText - - } - - -@code { - [Parameter] public string Icon { get; set; } = Icons.Material.Filled.Inbox; - [Parameter] public string Title { get; set; } = "موردی یافت نشد"; - [Parameter] public string? Description { get; set; } - [Parameter] public string? ActionText { get; set; } - [Parameter] public string? ActionHref { get; set; } - [Parameter] public EventCallback OnAction { get; set; } -} -``` - -### ۵.۳ PageHeader ارتقاء‌یافته - -```razor -@* Shared/PageHeader.razor — ارتقاء‌یافته *@ - - -@code { - [Parameter] public string Title { get; set; } = ""; - [Parameter] public string? Subtitle { get; set; } - [Parameter] public string? BackHref { get; set; } - - [Inject] private IJSRuntime JS { get; set; } = default!; - private async Task GoBack() => await JS.InvokeVoidAsync("history.back"); -} -``` - ---- - -## ✅ بخش ۶: چک‌لیست تکمیل هر فاز - -### فاز ۱ چک‌لیست: -- [ ] `CustomMudTheme.cs` — Primary→`#6366f1`, PaletteDark اضافه شد -- [ ] `site.css` — CSS Variables جدید (brand, semantic, soft, gradient) -- [ ] `Shared/LoadingState.razor` — ساخته و تست شد -- [ ] `Shared/EmptyState.razor` — ساخته و تست شد -- [ ] `Shared/PageHeader.razor` — Subtitle parameter اضافه شد -- [ ] `.page-container` CSS pattern اضافه شد -- [ ] Build: 0 errors ✅ -- [ ] Dark Mode: صحیح ✅ -- [ ] Mobile: صحیح ✅ - -### فاز ۲ چک‌لیست: -- [ ] `Profile/Personal` → `` -- [ ] `Profile/Addresses` → `` + `` + `` -- [ ] `Profile/Wallet` → `` -- [ ] `Profile/Settings` → `` -- [ ] `Profile/Tree` → `` -- [ ] `Profile/WithdrawalRequests` → `` + `` -- [ ] `Profile/ChangePassword` → `` -- [ ] `Profile/Index` → inline styles → CSS -- [ ] `Club/*` → `` + `` -- [ ] Build: 0 errors ✅ - -### فاز ۳ چک‌لیست: -- [ ] `Commission/*` → `` + `` -- [ ] `Network/*` → `` + `` -- [ ] `PackageDetail` → MudContainer wrapper برای loading/error -- [ ] `Checkout` → Elevation fix + inline cleanup -- [ ] `WeeklyBalance` → inline gradient → CSS class -- [ ] Build: 0 errors ✅ - -### فاز ۴ چک‌لیست: -- [ ] `Store/Products` → hero inline → CSS -- [ ] `Store/ProductDetail` → image inline → CSS class -- [ ] `DiscountStore/ProductDetail` → rgba → variable -- [ ] `Gateway/*` → hardcoded → variable -- [ ] Elevation یکسان‌سازی -- [ ] Container spacing یکسان‌سازی -- [ ] Build: 0 errors ✅ - -### فاز ۵ چک‌لیست: -- [ ] `Index.razor` → hero inline cleanup -- [ ] `About.razor` → radial-gradient cleanup -- [ ] `Blog/Index` + `Blog/Post` → inline cleanup -- [ ] `Contact.razor` + `FAQ.razor` → minor cleanup -- [ ] Build: 0 errors ✅ - -### فاز ۶ چک‌لیست: -- [ ] Routing fix (Categories, Blog/Post) -- [ ] MudSnackbar styling -- [ ] Dialog consistency -- [ ] Dark mode full test -- [ ] Mobile responsive full test -- [ ] Build: 0 errors ✅ - ---- - -## 📋 بخش ۷: خلاصه تغییرات در یک نگاه - -``` -فایل‌های تغییر‌یافته: -├── CustomMudTheme.cs [فاز ۱] — ارتقاء کامل تم -├── site.css [فاز ۱-۵] — CSS Variables + class‌های جدید -├── Shared/LoadingState.razor [فاز ۱] — جدید -├── Shared/EmptyState.razor [فاز ۱] — جدید -├── Shared/PageHeader.razor [فاز ۱] — بهبود -├── Profile/* (۷ فایل) [فاز ۲] — PageHeader + LoadingState -├── Profile/Index.razor [فاز ۲] — حذف inline styles -├── Club/* (۲ فایل) [فاز ۲] — PageHeader + LoadingState -├── Commission/* (۲ فایل) [فاز ۳] — PageHeader + LoadingState + cleanup -├── Network/* (۱ فایل) [فاز ۳] — PageHeader + LoadingState -├── PackageDetail.razor [فاز ۳] — Container fix -├── Checkout.razor [فاز ۳] — Elevation + cleanup -├── Store/* (۲ فایل) [فاز ۴] — inline → CSS -├── DiscountStore/ProductDetail [فاز ۴] — rgba → variable -├── Gateway/* (۳ فایل) [فاز ۴] — hardcoded → variable -├── Index.razor [فاز ۵] — hero cleanup -├── About.razor [فاز ۵] — gradient cleanup -├── Blog/* (۲ فایل) [فاز ۵] — inline cleanup -├── Contact.razor + FAQ.razor [فاز ۵] — minor cleanup -└── Categories + Blog/Post [فاز ۶] — routing fix -``` - -**مجموع فایل‌های تأثیرپذیر**: ~۳۵ فایل -**فایل‌های جدید**: ۲ (LoadingState, EmptyState) -**میزان تغییر UI**: ~۵۰٪ -**میزان تغییر UX**: ~۲۰٪ -**ریسک شکست**: پایین (تغییرات تدریجی، build verification در هر فاز) +See [totalDoc/INDEX.md](../../totalDoc/INDEX.md) for all documentation.