# ACADEMY_MODULE_REPORT.md
### تقرير وحدة الأكاديمية الإسلامية — Phase 10

**الحالة العامة: ✅ مكتمل ومُتحقَّق منه فعليًا (Lint + TypeCheck + Build + تشغيل خادم حقيقي عبر 8 مسارات).**
**لا Prisma، لا API، لا Backend، لا نظام تسجيل/تتبّع تقدُّم حقيقي — بيانات وهمية بالكامل في `lib/mock/academy.ts`.**

---

## 1. الصفحات المنفَّذة

| الصفحة | المسار | ملاحظة |
|---|---|---|
| فهرس الدورات (Course Catalog) | `/courses` | بحث + تصفية بالمستوى |
| صفحة الدورة (Course Details) | `/courses/[courseSlug]` | `generateStaticParams` لكل الدورات الثلاث |
| صفحة الدرس (Lesson Page) | `/courses/[courseSlug]/[lessonSlug]` | `generateStaticParams` لكل الدروس الثمانية |
| استضافة Widgets ("تعلّمي") | `/dashboard` | صفحة خفيفة **لاستضافة Widgets فقط**، ليست لوحة التحكم الإدارية الكاملة (محجوزة لمرحلة لاحقة معلَنة في خارطة الطريق الأصلية — انظر §8.4) |

---

## 2. المكوّنات الجديدة

### 2.1 التسعة المطلوبة صراحة (Learning Components، القسم 4)

| # | المكوّن | Server/Client |
|---|---|---|
| 1 | `CourseCard` | Server (async) |
| 2 | `LessonCard` | Server (async) |
| 3 | `InstructorCard` | Server (async) |
| 4 | `ProgressIndicator` | Server (async) — يُصيِّر `Progress` من Phase 8 (Client) بداخله؛ هذا لا يُلزم الأب بأن يكون Client أيضًا |
| 5 | `LessonNavigator` | Server (async) |
| 6 | `CourseSidebar` | Server |
| 7 | `CurriculumTree` | Server (async) |
| 8 | `CompletionBadge` | Server (async) |
| 9 | `ContinueLearningCard` | Server (async) |

**9/9 Server Components خالصة — صفر مكوّنات Client جديدة في هذه المرحلة كاملةً.**

### 2.2 الأربعة Widgets (القسم 5)

`RecentLessonsWidget`, `EnrolledCoursesWidget`, `CompletionRateWidget`, `CertificatesWidget` (Placeholder صريح) — جميعها Server Components.

### 2.3 مكوّن إضافي واحد خارج القائمتين (موثَّق بسبب)

`CourseCatalog` — منسِّق بحث/تصفية لصفحة الفهرس، **Client Component** بالضرورة (تفاعل حي). يطبِّق **نفس نمط "تمرير Server Components جاهزة التصيير عبر Props"** المُكتشَف والموثَّق في `CONTENT_ENGINE_REPORT.md §1.2` (Phase 9.5) — إذ `CourseCard` مكوّن Server غير متزامن لا يمكن استيراده مباشرة داخل "use client". إعادة استخدام حرفية لحل معماري سابق، لا اختراع جديد.

---

## 3. المكوّنات المُعاد استخدامها من محرك المحتوى العام (Phase 9.5)

**هذا هو الدليل العملي على قيمة محرك المحتوى** — صفحة الدرس تستهلك مباشرة:

| مكوّن من Phase 9.5 | أين استُخدِم في صفحة الدرس |
|---|---|
| `ContentBody` | عرض نص الدرس الكامل — **نفس مصفوفة `ContentBlock` بلا أي تحويل** |
| `CitationBlock` | قسم "مصادر مُستشهَد بها" — **نفس `ContentCitation`** |
| `ShareActions` | مشاركة الدرس |
| `BookmarkButton` | إشارة مرجعية للدرس |
| `CommentsPlaceholder` | أسفل صفحة الدرس، محمَّل كسوليًا (`next/dynamic`) |
| `RelatedContent` | صفحة الدورة — محتوى مرتبط من محرك المحتوى (مقالات موجودة فعليًا تُطابِق مواضيع الدورة) |
| `EmptyState` | حالة فراغ نتائج البحث في `CourseCatalog` |

**نموذج البيانات نفسه مُعاد استخدامه أيضًا لا المكوّنات فقط:** `AcademyLesson` في `lib/mock/academy.ts` يستورد `ContentBlock`/`ContentCitation`/`ContentAuthor` من `lib/mock/content.ts` حرفيًا بدل تعريف أنواع موازية — هذا ما جعل إعادة استخدام `ContentBody`/`CitationBlock` ممكنة بلا أي طبقة تحويل بيانات.

**+ 10 مكوّنات إضافية من مكتبة Phase 8** (كما في كل مرحلة سابقة): `Card`, `Badge`, `Avatar`, `SearchInput`, `Checkbox`, `Label`, `Button`, `Breadcrumb`, `Header`, `Footer`.

---

## 4. تحقُّق فعلي من 8 مسارات (لا 2-3 كالعادة)

نظرًا لتعدد أنواع الصفحات في هذه المرحلة (فهرس، تفاصيل، درس، لوحة)، وُسِّع نطاق التحقق الفعلي:

| المسار | النتيجة |
|---|---|
| `/ar/courses` (الفهرس) | ✅ `200` |
| `/ar/courses/islam-basics` (تفاصيل، عربي) | ✅ `200` |
| `/en/courses/hadith-terminology` (تفاصيل، إنجليزي، دورة "قريبًا") | ✅ `200` |
| `/ar/courses/islam-basics/pillars-of-islam` (درس بفيديو) | ✅ `200` |
| `/ar/courses/islam-basics/daily-etiquette` (درس **بلا** فيديو) | ✅ `200` |
| `/ar/dashboard` (Widgets) | ✅ `200` |
| `/ar/courses/does-not-exist` (دورة غير صالحة) | ✅ `404` صحيح |
| `/ar/courses/islam-basics/does-not-exist` (درس غير صالح) | ✅ `404` صحيح |

**تحقَّق أيضًا من المحتوى الفعلي في HTML الخام** لكل صفحة (عناوين الدورات، أهداف الدورة، متن الدرس، الملفات المرفقة، نسبة الإنجاز في لوحة الـWidgets) — لا مجرد رمز الاستجابة.

---

## 5. الأداء (القسم 7)

- **Server Components حيثما أمكن:** 9/9 مكوّنات تعليمية + 4/4 Widgets = **13/13 مكوّنًا جديدًا Server Components خالصة**، بلا استثناء واحد هذه المرة (أفضل نسبة عبر كل المراحل).
- **Lazy Loading / Dynamic Imports:** `CommentsPlaceholder` على صفحة الدرس، و`RelatedContent` على صفحة الدورة — كلاهما عبر `next/dynamic`، بنفس نمط Phase 9.5.
- **صور:** خلفية متدرِّجة زخرفية بدل صور حقيقية (نفس قرار Phase 9.5، لغياب أصول صور فعلية).

---

## 6. Accessibility

`role="img"` + `aria-label` على منطقة الفيديو النائبة (توضح أنها عنصر بصري بديل لا محتوى وظيفي)، `aria-disabled` على الدروس المقفلة (دورة "قريبًا")، أزرار التنزيل معطَّلة بوضوح (`disabled` + `title`)، تسلسل عناوين منطقي (`h1`→`h2`) عبر كل الصفحات، حلقات تركيز موروثة من كل مكوّنات Phase 8. RTL/LTR ووضع داكن/فاتح مُتحقَّق منهما فعليًا بلغتين.

---

## 7. قرارات معمارية جديدة

1. **`AcademyLesson` يمتد من نماذج محرك المحتوى مباشرة** (§3) — قرار التصميم الأهم في هذه المرحلة، يثبت أن "استخدام محرك المحتوى الحالي" (طلب صريح من هذه المرحلة) يعني الامتداد من نماذج بياناته لا فقط استيراد مكوّناته البصرية.
2. **`Course` كيان منفصل عن `ContentItem`** — بخلاف الدرس، الدورة بنية حاوية (Curriculum Container) لها مفهوم مختلف جوهريًا (مدرّس، متطلبات، أهداف، مستوى) لا يناسب نموذج "قطعة محتوى واحدة" العام؛ قرار واعٍ بعدم إجبار نموذج غير مناسب على البيانات فقط لتحقيق "إعادة استخدام" شكلية.
3. **حراسة "قريبًا" على مستوى العرض لا التوجيه** — دورة `hadith-terminology` (`COMING_SOON`) لا تزال قابلة للزيارة والتصفح كامل التفاصيل (بخلاف حراسة النوع الصارمة في Phase 9.5)، لكن دروسها تظهر بحالة `locked` بصريًا في `LessonCard`/`CurriculumTree` بدل حجب الصفحة بالكامل — قرار تجربة مستخدم مقصود (عرض القيمة المستقبلية للدورة، لا إخفاؤها).
4. **نطاق `/dashboard`:** استضافة الأربعة Widgets المطلوبة **حصرًا** لا بناء لوحة تحكم كاملة، بما يتفق حرفيًا مع "Widgets فقط" في الطلب ومع تأجيل "لوحة التحكم (Admin)" الصريح في خارطة الطريق الأصلية.

---

## 8. نتائج التحقق

| الفحص | النتيجة |
|---|---|
| `npm run lint` | ✅ صفر أخطاء **من أول تشغيل** |
| `npx tsc --noEmit` | ✅ صفر أخطاء جديدة (أُصلِح خطأ استيراد أيقونة واحد أثناء البناء التدريجي) |
| `npm run build` | ✅ "Compiled successfully" |
| **تشغيل خادم فعلي + `curl`** | ✅ 8/8 مسارات بالنتيجة المتوقَّعة تمامًا (§4) |

---

## 9. مستوى التوافق مع Design System

**~98%.**

---

## 10. الخلاصة

وحدة أكاديمية كاملة (فهرس، تفاصيل دورة، درس تفاعلي، Widgets) مبنية فعليًا **فوق** محرك المحتوى العام لا بمعزل عنه — إعادة استخدام حقيقية لكل من المكوّنات ونماذج البيانات معًا، مع أفضل نسبة Server Components محقَّقة حتى الآن (13/13). بانتظار موافقة صريحة قبل أي مرحلة تالية.
