diff --git a/apps/admin-panel/src/assets/styles/farsi.less b/apps/admin-panel/src/assets/styles/farsi.less
index 966f167..4894a91 100644
--- a/apps/admin-panel/src/assets/styles/farsi.less
+++ b/apps/admin-panel/src/assets/styles/farsi.less
@@ -1,60 +1,52 @@
// Ported from legacy henza_admin/src/assets/scss/ara/farsi.scss
// Converted .scss -> .less (no Sass features were used; this file is plain CSS).
//
-// PORTED FAITHFULLY INCLUDING A KNOWN LEGACY BUG — see docs/ADMIN-PORT-PLAN.md:
-// 1. All five @font-face blocks point at the SAME iran-yekan-400.woff2 file even
-// though iran-yekan-700.woff2 exists. Bold text therefore renders in the
-// regular weight (synthesised bold at best).
-// 2. `format("woff")` is declared for a .woff2 file (wrong format hint).
-// 3. The `body, *` reset sets `font-weight: inherit`, which flattens all heading
-// weights (h1..h6 lose their default bold).
-// None of these are fixed here. Flagged, not silently corrected.
+// CSS bugs fixed here (approved departure from byte-faithful porting — see
+// docs/ADMIN-PORT-PLAN.md rule 2; listed rather than silently applied):
+// 1. FIXED: the bold/700 @font-face blocks pointed at the SAME
+// iran-yekan-400.woff2 file even though iran-yekan-700.woff2 exists, so
+// bold text rendered in the regular weight. They now load the 700 file.
+// There is no source file for weight 300 (only 400/700 exist on disk),
+// so that face is dropped rather than mapped to another weight.
+// 2. FIXED: `format("woff")` was declared for a .woff2 file (wrong format
+// hint). Corrected to format("woff2").
+// 3. FIXED: the `body, *` reset set `font-weight: inherit`, which flattened
+// every heading's weight (h1..h6 rendered at their parent's weight
+// instead of bold). Removed; browsers' default heading weights apply.
@font-face {
font-family: 'p-yek';
- src: url("../fonts/yekan/iran-yekan-400.woff2") format("woff");
+ src: url("../fonts/yekan/iran-yekan-400.woff2") format("woff2");
font-weight: normal;
- font-style: normal
+ font-style: normal;
}
-
@font-face {
font-family: 'p-yek';
- src: url("../fonts/yekan/iran-yekan-400.woff2") format("woff");
+ src: url("../fonts/yekan/iran-yekan-700.woff2") format("woff2");
font-weight: bold;
}
-
@font-face {
font-family: 'p-yek';
- src: url("../fonts/yekan/iran-yekan-400.woff2") format("woff");
+ src: url("../fonts/yekan/iran-yekan-700.woff2") format("woff2");
font-weight: 700;
}
-
@font-face {
font-family: 'p-yek';
- src: url("../fonts/yekan/iran-yekan-400.woff2") format("woff");
- font-weight: 300;
-}
-
-@font-face {
- font-family: 'p-yek';
- src: url("../fonts/yekan/iran-yekan-400.woff2") format("woff");
+ src: url("../fonts/yekan/iran-yekan-400.woff2") format("woff2");
font-weight: 400;
}
body, * {
- font-family: p-yek ,sans-serif, tahoma;
+ font-family: p-yek, sans-serif, tahoma;
letter-spacing: 0px !important;
font-size: inherit;
line-height: inherit;
- font-weight: inherit;
}
-
-
-.ara-icon-button{
+.ara-icon-button {
width: 35px;
height: 35px;
border-radius: 50%;
diff --git a/apps/admin-panel/src/views/DashboardECommerce.vue b/apps/admin-panel/src/views/DashboardECommerce.vue
index 10298d2..836c71d 100644
--- a/apps/admin-panel/src/views/DashboardECommerce.vue
+++ b/apps/admin-panel/src/views/DashboardECommerce.vue
@@ -126,16 +126,7 @@ onMounted(async () => {
+
diff --git a/apps/admin-panel/src/views/apps/customer/ReagentCustomer.vue b/apps/admin-panel/src/views/apps/customer/ReagentCustomer.vue
index 95a0599..8fc83b5 100644
--- a/apps/admin-panel/src/views/apps/customer/ReagentCustomer.vue
+++ b/apps/admin-panel/src/views/apps/customer/ReagentCustomer.vue
@@ -258,16 +258,8 @@ onMounted(async () => {
+
diff --git a/apps/admin-panel/src/views/apps/customer/singleCustomer.vue b/apps/admin-panel/src/views/apps/customer/singleCustomer.vue
index 50a9521..913ac76 100644
--- a/apps/admin-panel/src/views/apps/customer/singleCustomer.vue
+++ b/apps/admin-panel/src/views/apps/customer/singleCustomer.vue
@@ -132,6 +132,4 @@ onMounted(async () => {
});
-
+
diff --git a/apps/admin-panel/src/views/apps/product/AddProduct.vue b/apps/admin-panel/src/views/apps/product/AddProduct.vue
index 7393364..967bf9c 100644
--- a/apps/admin-panel/src/views/apps/product/AddProduct.vue
+++ b/apps/admin-panel/src/views/apps/product/AddProduct.vue
@@ -352,11 +352,7 @@ onMounted(async () => {
+
diff --git a/apps/admin-panel/src/views/branch/AddBranches.vue b/apps/admin-panel/src/views/branch/AddBranches.vue
index 5419fcd..21c51a4 100644
--- a/apps/admin-panel/src/views/branch/AddBranches.vue
+++ b/apps/admin-panel/src/views/branch/AddBranches.vue
@@ -113,10 +113,4 @@ onMounted(async () => {
});
-
+
diff --git a/apps/admin-panel/src/views/city/createCity.vue b/apps/admin-panel/src/views/city/createCity.vue
index 0901e6c..4614569 100644
--- a/apps/admin-panel/src/views/city/createCity.vue
+++ b/apps/admin-panel/src/views/city/createCity.vue
@@ -47,6 +47,4 @@ async function handleSubmit() {
}
-
+
diff --git a/apps/admin-panel/src/views/finical/addFinDoc.vue b/apps/admin-panel/src/views/finical/addFinDoc.vue
index d6a64da..95d850a 100644
--- a/apps/admin-panel/src/views/finical/addFinDoc.vue
+++ b/apps/admin-panel/src/views/finical/addFinDoc.vue
@@ -228,10 +228,4 @@ onMounted(async () => {
});
-
+
diff --git a/apps/admin-panel/src/views/invoice/AddInvoice.vue b/apps/admin-panel/src/views/invoice/AddInvoice.vue
index c811d0d..f6001ac 100644
--- a/apps/admin-panel/src/views/invoice/AddInvoice.vue
+++ b/apps/admin-panel/src/views/invoice/AddInvoice.vue
@@ -181,11 +181,7 @@ onMounted(async () => {
+
diff --git a/apps/admin-panel/src/views/offersIgnore/offersIgnore-add-edit.vue b/apps/admin-panel/src/views/offersIgnore/offersIgnore-add-edit.vue
index 90326ba..43226a4 100644
--- a/apps/admin-panel/src/views/offersIgnore/offersIgnore-add-edit.vue
+++ b/apps/admin-panel/src/views/offersIgnore/offersIgnore-add-edit.vue
@@ -211,11 +211,7 @@ onMounted(getData);
diff --git a/apps/admin-panel/src/views/promotion/autopromotion.vue b/apps/admin-panel/src/views/promotion/autopromotion.vue
index 6e2b9f4..82e8825 100644
--- a/apps/admin-panel/src/views/promotion/autopromotion.vue
+++ b/apps/admin-panel/src/views/promotion/autopromotion.vue
@@ -75,10 +75,4 @@ onMounted(async () => {
});
-
+
diff --git a/apps/admin-panel/src/views/reg.vue b/apps/admin-panel/src/views/reg.vue
index f8f77e7..6fefbdc 100644
--- a/apps/admin-panel/src/views/reg.vue
+++ b/apps/admin-panel/src/views/reg.vue
@@ -116,9 +116,5 @@ async function handleSubmit() {
width: 100%;
max-width: 900px;
}
-.grid-3 {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
- gap: 1rem;
-}
+/* .grid-3 now comes from the global utilities.less (dedup) */
diff --git a/apps/admin-panel/src/views/report/order_item.vue b/apps/admin-panel/src/views/report/order_item.vue
index 7b5372c..8df7b42 100644
--- a/apps/admin-panel/src/views/report/order_item.vue
+++ b/apps/admin-panel/src/views/report/order_item.vue
@@ -87,11 +87,7 @@ onMounted(load);
diff --git a/apps/admin-panel/src/views/statics/index.vue b/apps/admin-panel/src/views/statics/index.vue
index 507fc85..a777d0c 100644
--- a/apps/admin-panel/src/views/statics/index.vue
+++ b/apps/admin-panel/src/views/statics/index.vue
@@ -87,6 +87,4 @@ onMounted(async () => {
});
-
+
diff --git a/apps/admin-panel/src/views/user/Permission.vue b/apps/admin-panel/src/views/user/Permission.vue
index 32ed7e1..a47c98c 100644
--- a/apps/admin-panel/src/views/user/Permission.vue
+++ b/apps/admin-panel/src/views/user/Permission.vue
@@ -207,11 +207,7 @@ onMounted(async () => {
+
diff --git a/docs/ADMIN-PORT-PLAN.md b/docs/ADMIN-PORT-PLAN.md
index c669614..9e63914 100644
--- a/docs/ADMIN-PORT-PLAN.md
+++ b/docs/ADMIN-PORT-PLAN.md
@@ -132,9 +132,9 @@ OmdeArchivedList.vue 612
| 1 | `router.push` بدون `next()` داخل `beforeEach` | `router.js:198` | در Vue Router 4 روتر را قفل میکند. Phase 2 با `next({path:'/auth/login'})` معادلسازی میشود؛ رفتار کاربر یکسان. |
| 2 | `roles` در module-scope که هنگام logout باطل نمیشود | `router.js:162,190` | کاربر بعدی دسترسیهای کاربر قبلی را میگیرد. Phase 2 داخل store نگه داشته و روی logout پاک میشود. |
| 3 | `token` و `user` در state بهجای مقدار، **تابع** تعریف شدهاند | `store/auth/moduleAuth.js` | `store.state.auth.token` همیشه truthy است، پس شرط `isLogin` در `getPermission()` بیاثر است. وفادار پورت میشود. |
-| 4 | هر ۵ بلاک `@font-face` به همان `iran-yekan-400.woff2` اشاره میکنند | `assets/scss/ara/farsi.scss` | فایل `iran-yekan-700.woff2` وجود دارد ولی هرگز بارگذاری نمیشود؛ متن bold با وزن معمولی رندر میشود. **عیناً پورت شد.** |
-| 5 | `format("woff")` برای فایل `.woff2` | `farsi.scss` | راهنمای فرمت غلط. **عیناً پورت شد.** |
-| 6 | `font-weight: inherit` در ریست `body, *` | `farsi.scss` | وزن پیشفرض همهی هدینگها (h1..h6) صاف میشود. **عیناً پورت شد.** |
+| 4 | هر ۵ بلاک `@font-face` به همان `iran-yekan-400.woff2` اشاره میکنند | `assets/scss/ara/farsi.scss` | فایل `iran-yekan-700.woff2` وجود دارد ولی هرگز بارگذاری نمیشود؛ متن bold با وزن معمولی رندر میشود. **اصلاح شد (۲۰۲۶-۰۹-۱۴، طبق درخواست کاربر): وزن bold/700 اکنون به `iran-yekan-700.woff2` اشاره میکند.** |
+| 5 | `format("woff")` برای فایل `.woff2` | `farsi.scss` | راهنمای فرمت غلط. **اصلاح شد: `format("woff2")` صحیح شد.** |
+| 6 | `font-weight: inherit` در ریست `body, *` | `farsi.scss` | وزن پیشفرض همهی هدینگها (h1..h6) صاف میشود. **اصلاح شد: `font-weight: inherit` حذف شد؛ وزن پیشفرض هدینگها بازگشت.** |
| 7 | منو `permissionId:"newsletters.newsletters"` دارد ولی route اش `role: 'newsletters'` است — و آن هم **کامنت شده** | `navMenuItems.js:481` / `router/admin.js:851` | هیچوقت با هم مچ نمیشوند؛ آیتم خبرنامه برای همه پنهان میماند مگر rid دقیقاً `newsletters.newsletters` داده شود. |
| 8 | منو `permissionId:"wallet.list"` دارد ولی route اش `role: 'wallet'` است | `navMenuItems.js:262` / `router/admin.js:430` | `checkParent` فقط والد میسازد نه فرزند، پس `wallet` هرگز `wallet.list` را تولید نمیکند. آیتم منو پنهان میماند در حالی که خود صفحه باز میشود. |
| 9 | `secondary-color` و `third-color` در `modifyVars` متغیر واقعی ant نیستند | `vue.config.js` | بیاثرند (در خود legacy هم بیاثر بودند). راستیآزمایی شد: در `default.less` وجود ندارند. **رفتار یکسان حفظ شد.** |