Skip to content

architecture

SalehGNUTUX edited this page Jul 24, 2026 · 3 revisions

البنية التقنية — مشروع «تلميذي»

الرفيق التقنيّ لكرّاسة المشروع (tilmithi-project.md في D:\koora-web). تحديث جوهريّ (2026-06-10): أُزيل الذكاء الاصطناعي من المشروع. الآليّ يعمل الآن بمحتوًى مُعَدّ مسبقًا محليًّا، لا بنموذج لغويّ.


🧭 القرار الجوهري

التطبيق محليّ بالكامل، بلا ذكاء اصطناعي وبلا اتصال بالإنترنت.

«دماغ» الآليّ لم يَعُد نموذجًا يولّد ويتحدّث؛ صار مكتبة محتوًى مُعَدّة مسبقًا + آلة حالات داخل التطبيق تُرتّب هذا المحتوى. لا خادم، لا مفتاح، لا سحابة، لا تكلفة، ولا شيء يغادر الجهاز.

ما كان يفعله الذكاء الاصطناعي (توليد الذكريات/المهام، الاستماع لتقرير الطفل، تقرير أنّ الآليّ «تذكّر») يصير الآن محتوًى نؤلّفه سلفًا، والتطبيق يعرضه ويتتبّع التقدّم. تبقى «الحلقة السحرية» كما هي؛ والمقايضة: محتوًى محدود مؤلَّف بدل توليد لا نهائيّ — وهو مناسب وأكثر أمانًا وثباتًا لتجربة طفل.


🧱 الطبقات

1) الواجهة — تطبيق ويب تقدّمي (PWA)

Vite + TypeScript. تُثبَّت وتعمل دون اتصال بالكامل. الإطار (React / Svelte / فانيلا كـ koora-web) تفصيل ثانويّ.

2) التخزين — محليّ (IndexedDB)

تقدّم الطفل، حالة شفاء الآليّ، الذكريات المُنجَزة، أي تسجيلات — كلّها على الجهاز. ومكتبة المحتوى مُضمَّنة محليًّا (JSON + وسائط).

3) الوسيط — أُلغي

لا مفتاح نخفيه ولا خادم نكلّمه. التطبيق مكتفٍ بذاته؛ يكفي تشغيل ملفات ثابتة محليًّا.

4) محرّك المحتوى المحليّ — بديل «الدماغ»

  • مكتبة محتوى مؤلَّفة سلفًا: الذكريات/المهام + جُمل الآليّ + ردوده، كبيانات محليّة.
  • آلة حالات في التطبيق تُرتّبها: الشرارة → المهمة → التلقين → الشفاء.
  • حتميّ، غير متّصل، آمن تمامًا.
  • نموذج المحتوى المعتمد: مكتبة مُعَدّة مسبقًا (قرار 2026-06-10) — نؤلّف الذكريات/المهام/جُمل الآليّ/ردوده سلفًا كبيانات محليّة، والتطبيق يرتّبها.

5) الأمان — أبسط وأقوى الآن

بلا نموذج لغويّ: لا دردشة مُولَّدة، لا حقن أوامر، لا رفض غير متوقَّع. مدخلات الطفل تُحرّك التقدّم/الاختيار فقط. يبقى: مغلق، رفيق أهل، موجَّه بالمسار.

6) المحتوى — كـ JSON محليّ (مؤلَّف يدويًّا)

نفس مخطّط المهمة أدناه، لكنه يُكتَب سلفًا لا يُولَّد. التنسيق الكامل ونموذج الشفاء في content-format.md، والبيانات في content/library.js.

7) الصوت

بلا نموذج، يمكن تسجيل جُمل الآليّ مسبقًا (صوت دافئ وثابت — حتى صوت أحد أفراد العائلة!) بدل أي تركيب آليّ. كله محليّ. أو SpeechSynthesis للمتصفح إن فُضِّل.

8) الخصوصية — مطلقة

لا حسابات، لا شبكة، لا شيء يغادر الجهاز.


🔁 آلة الحالات (الحلقة) — دوالّ داخل التطبيق (لا نقاط HTTP)

الحالة الوظيفة
الشرارة تختار الذكرى التالية من المكتبة وتعرض جملة الآليّ
المهمة تعرض/تطبع البطاقة؛ الطفل يفعلها في الواقع
التلقين الطفل/الأب يُعلِّم الإنجاز (+ تأمّل اختياريّ)
الشفاء تُضيء الشريحة ويعود جزء اللون؛ يُشغَّل ردّ الآليّ المُسجَّل مسبقًا

🧩 مخطّط المحتوى (JSON — مؤلَّف يدويًّا)

{
  "domain": "هندسة|لغة|أخلاق|علوم|تفكير",
  "age_band": "4-6|7-10",
  "robo_line": "جملة الآليّ القصيرة (شرارة الذكرى)",
  "child_steps": ["خطوة واقعية", "..."],
  "materials": ["أشياء من البيت"],
  "success_signal": "كيف نعرف أنّ الطفل أنجزها",
  "healing_reward": "أيّ جزء من الآليّ يضيء"
}

💵 التكلفة

صفر. لا واجهات برمجية ولا اشتراكات.


📱 النموذج الأوّليّ (شريحة عموديّة) ✅

يعمل من الطرف للطرف في app/ — HTML/JS صرف، بلا بناء وبلا ذكاء اصطناعي:

  • يقرأ content/library.js، يُمرّر ذكرى عبر الحالات الأربع (شرارة → مهمة → تلقين → شفاء)، ويُضيء جزءًا من الآليّ (SVG) مع حفظ التقدّم في localStorage.
  • فلتر بالفئة العمريّة + صفّ عناصر العالم + معلَم الضحكة عند ٨.
  • رسومات SVG كرتونيّة محليّة في وحدة مشتركة src/art.js: لكلّ قصّة مشهدٌ خاصّ مفصّل/طفوليّ عند توفّره (ART[id]) وإلّا رسمُ مجالها (DOMAIN_ART)، يظهر في التطبيق والمطبوعات والفهرس معًا؛ ورسوم ملوّنة لعناصر عالم الآليّ تُشرق عند الشفاء. أُنجِز 10 مشاهد مفصّلة حتى الآن، قابلة للنموّ حتى تغطية الـ71. كلّها متّجهة محليّة بلا صور خارجيّة.
  • الفهرس (home.html): لوحة رئيسيّة تربط المكوّنات (التطبيق · المطبوعات · لوحة الأهل · القصص) + فهرس المكتبة كاملًا (بحث/تصفية بالمجال والعمر، وكلّ ذكرى رابطٌ يفتحها). التطبيق يدعم ?memory=<id> (يفتح ذكرى بعينها) و?parent=1 (يفتح بوّابة الأهل). زرّ 🏠 يربط الكلّ.
  • قصص مصوّرة (stories.html): قصص أصيلة (تأليفنا) بصورٍ كرتونيّة كبيرة (src/story-art.js)؛ قارئٌ بصفحات + نقاط تقدّم + درسٌ ختاميّ. البيانات في content/stories.js. 8 قصص حتى الآن (مثابرة، صبر، شجاعة، صدق، تعاون، فضول، رحمة بالحيوان، نظافة)، قابلة للنموّ.
  • ألعاب وأنشطة (play.html): لعبة مطابقة الذاكرة برسومنا الأصيلة (3 مستويات صعوبة)، بنيةٌ قابلة لإضافة أنشطة أخرى (توصيل نقاط، تلوين، اختبار). كلّه محتوًى أصيل — لا اقتباس من جهةٍ أخرى.
  • لوحة الأهل (خلف بوّابة حسابية): نظرة عامة، تقدّم حسب المجال مع تفعيل/تعطيل، مفتاح إظهار/إخفاء ذكريات الإخوة (pair)، سجلّ جلسات مؤرّخ، والتقاط صوت/صورة محليّ يُحفظ في IndexedDB (لا يغادر الجهاز).
  • المطبوعات (app/print.html): بطاقات مهام قابلة للقصّ + ملصق «خريطة شفاء الآليّ» للتلوين، مفلترة بالمجال/العمر، تُطبع أو تُحفظ PDF عبر المتصفح (بلا مكتبات).
  • التشغيل (محدّث 2026-06-12): بعد تحويل البيانات إلى وحدات JS، تعمل صفحات الجذر مباشرةً بأيّ خادم ثابت — من D:\kidlearn نفّذ python -m http.server 8123 وافتح http://localhost:8123/home.html (لم يَعُد التشغيل محصورًا في /app/). أو npm run dev.
  • تمّ التحقّق منه حيًّا (2026-06-10): الحلقة كاملة، الآليّ يتعافى، والبوّابة/اللوحة/المفاتيح/السجلّ تعمل.

🏭 بناء الإنتاج (Vite + PWA) ✅

نسخة الإنتاج في جذر المشروع (index.html + print.html) مبنيّة بـ Vite وvite-plugin-pwa:

  • المكتبة مُضمَّنة في الحزمة عبر import library from "./content/library.js" — لا جلب شبكيّ، فيعمل دون اتصال بلا حيلة.
  • Service Worker (Workbox) يُنشأ تلقائيًّا ويُسبِق-تخزين كلّ الأصول ← يعمل دون اتصال؛ وmanifest.webmanifestقابل للتثبيت كتطبيق.
  • الأوامر: npm install ثمّ npm run dev (تطوير) أو npm run build (يُنتج dist/)؛ تُخدَم dist/ كملفّات ثابتة في أيّ مكان.
  • تمّ التحقّق منه حيًّا (2026-06-10): البناء ينجح، الـ SW مُفعَّل ويُسبِق-تخزين 8 ملفات، المكتبة (٥٦) محمّلة من الحزمة، الحلقة تعمل، بلا أخطاء.
  • البنية: الجذر = مصدر الإنتاج (يحتاج npm run dev/build). مجلّد app/ = النسخة القديمة بلا بناء (تعمل عبر python -m http.server) — قابلة للحذف لاحقًا.

🗂️ ملفّات البيانات = وحدات JS (تعمل بأيّ خادم ثابت) — قرار 2026-06-12

بياناتُ المحتوى في content/ هي وحدات ES (content/*.js بصيغة export default {…})، لا ملفّات .json. السبب: المتصفّح لا يدعم import x from "./x.json" بدون أداة بناء، فكانت الصفحات تظهر فارغةً عند تشغيل الجذر الخام عبر python -m http.server (بلا Vite). أمّا استيراد وحدة .js فيعمل أصلًا في كلّ متصفّح. النتيجة: المشروع يعمل الآن بثلاث طرق دون أيّ تغيير:

  1. خادم ثابت خام على الجذر (python -m http.server) — يفتح index.html/home.html مباشرةً.
  2. Vite dev (npm run dev).
  3. بناء Vite (npm run build ثمّ خدمة dist/) — تُضمَّن البيانات في الحزم. أداة tools/import-from-gtsararim.mjs تُخرج .js (export default). تنسيق الحقول لا يزال JSON-الشكل؛ التغيير في الغلاف فقط.

🔤 ألعاب الكلمات — دمج الحروف (إضافة 2026-06-11، أصيلة)

أصيلٌ من تأليفنا (لا علاقة لها بـ GT-SARARIM) لتدريب الطفل على دمج الحروف لتكوين كلمات — كلّ فكرةٍ حسّيّة اقترحها صاحب المشروع صارت لعبةً تفاعليّة بآليّةٍ ذهنيّة مختلفة (لا مجرّد حُلّةٍ بصريّة). تعيش كلّها داخل صفحة «ألعاب وأنشطة» play.html (دُمِجت مع لعبة الذاكرة في مركزٍ واحد بقائمةٍ menu)؛ القائمة تفتح لعبة الذاكرة + سبع ألعابٍ للحروف:

  • 🚂 قطار: ترتيب — يبني الكلمة من الصفر بوضع الحروف في خانات.
  • 🧺 مشابك الغسيل: تبديل — الحروف مبعثرةٌ معلّقة، يضغط حرفين ليتبادلا حتى يصحّ الترتيب (فرز).
  • 🧱 بناء المكعّبات: إكمال — الكلمة شبه مكتملة بحرفٍ (أو حرفين) ناقص، يختار المكعّب الصحيح وسط بدائل.
  • 🎣 صيد الحروف: انتقاء وسط تشتيت — بِركةٌ فيها حروف الكلمة + حروفٌ دخيلة، يصطاد الصحيح بالترتيب ويتجاهل الدخيل.
  • 🧩 بطاقات الصور: تمييز — ثلاث كتاباتٍ للكلمة (صحيحة + مبعثرتان)، يختار الصحيحة (اختيار من متعدّد).
  • 🌀 متاهة الحروف: تنقّل مكانيّ — شبكةٌ تُولَّد بمسارٍ ذاتيّ التجنّب (self-avoiding walk) + حروف تشتيت؛ يمشي على خلايا الكلمة بالتجاور حتى الصورة.
  • 🎡 عجلة الحروف: استكشاف/دمج صوتيّ — بكراتٌ تُدار/تُنقَر، الحروف مدموجةٌ وتُنطَق، مع كشف «كلمة حقيقية».
  • 🖨️ أنشطة للطباعة: البطاقات الحسّيّة السبع للأهل (الأصل الورقيّ).

ملاحظات تقنيّة: بنك الكلمات في content/words.js (بالإيموجي بلا صورٍ خارجيّة، كلماتٌ تنفصل حروفها وتتّصل بلا لا/شدّة). الاتّصال يعتمد تشكيل المتصفّح التلقائيّ عند ضمّ الحروف في نصٍّ واحد. لكلّ لعبةٍ حالتُها ومنطقُها المستقلّ (لا محرّك مشترك). النطق اختياريّ عبر SpeechSynthesis (محليّ، يتعطّل بلطفٍ إن غاب). كلّها مُضمّنةٌ في play.html (لا مدخل Vite منفصل) ومربوطةٌ من home.html.


🔤 الأساسيّات — ما قبل القراءة (إضافة 2026-06-12، أصيلة)

basics.html — الرُّكن التأسيسيّ تحت ألعاب الكلمات (الحروف/الأرقام/الحركات)، قائمةٌ تفتح خمسة أنشطة: بطاقات الحروف (الحرف + اسمه + 🔊 + كلمةٌ مثال + أشكال أوّل/وسط/آخر)، أين الحرف؟ (تعرُّفٌ سمعيّ‑بصريّ)، بطاقات الأرقام (٠–١٠ بالعدّ)، عُدّ معي (كم العدد؟)، الحركات (فتحة/ضمّة/كسرة + لعبة «أيّ حركة سمعت؟»). البيانات في content/letters.js (الـ28 حرفًا + الأرقام). أشكال الحرف الثلاثة تُشتقّ بالرابط الصِّفريّ ZWJ () بدل تخزينها. النطق عبر SpeechSynthesis (محليّ).

📖 سُلّم القراءة (إضافة 2026-06-12، أصيلة)

read.html — الجسر بين «الأساسيّات» و«ألعاب الكلمات»، ثلاث درجات متدرّجة لتعليم فكّ القراءة:

  • ﹷ المقاطع: حرف ساكن × حركة ← مقطع (بَ/بُ/بِ)؛ يضغط الطفل الحركة فيسمع المقطع، ويتنقّل بين الحروف.
  • 🔗 اجمع الكلمة: الكلمة مقسومةٌ مقاطعَ مشكّلة (قَ·مَ·رْ بالإيموجي)؛ يقرأ كلّ مقطع (نطق) ثمّ «اقرأ الكلمة كاملةً» (دمج صوتيّ + كشف الكلمة).
  • 📜 اقرأ الجملة: جملةٌ قصيرة بالحركات؛ يضغط كلّ كلمة لسماعها ثمّ يقرأ الجملة كاملة.

البيانات في content/reading.js (16 كلمة بمقاطعها + 8 جُمل + قائمة حروف). النطق عبر SpeechSynthesis. تُسجّل التقدّم (read_practice) ولها وسامٌ خاصّ. مُضمَّنة في vite.config.js (مدخل read) ومربوطة من home.html.

🏆 التقدّم والتحفيز (إضافة 2026-06-12، أصيلة)

وحدةٌ مشتركة src/progress.js (localStorage، لا شيء يغادر الجهاز) تُصدِّر logEvent(type) تستدعيها كلّ الأقسام عند نقطة النجاح: شفاء ذكرى (index.html) · فتح قصّة وإجابة فهم (tales) · كشف حلّ لغز (puzzles) · إنهاء اختبار بنتيجته (quiz) · فوز لعبة حروف/ذاكرة (play) · إجابة في الأساسيّات (basics). تحسب: سلسلة الأيّام (streak)، مجموع النجوم، الأقسام المُجرّبة، و12 وسامًا بشروط، و**«مهمّة اليوم»** (٣ مهامّ تُكتمَل بنشاطٍ من نوعها اليوم). الواجهة progress.html: مهمّة اليوم + إحصاءات + أوسمة + شهادة إنجاز قابلة للطباعة باسم الطفل. وhome.html يعرض شريط «مهمّة اليوم». كلّ هذا حتميّ ومحليّ بلا حساب.

📦 مجموعة GT-SARARIM (إضافة 2026-06-11)

أُدرِجت بياناتُ المحتوى من مشروع GT-SARARIM (GPL-3.0) كمجموعةٍ محليّةٍ مستقلّة، محوَّلةٍ إلى JSON عبر أداة tools/import-from-gtsararim.mjs:

  • 51 قصّة + 102 سؤال فهم → content/sararim-stories.js تُعرَض في tales.html («قصص وعِبَر»: نصّ بالحركات + أسئلة فهم، تصفية بالقسم/العمر، تغذية راجعة فوريّة).
  • 61 لغزًا (فوازير/منطق، 4 مستويات) → content/puzzles.js تُعرَض في puzzles.html («ألغاز ذكية»: لغز ← تلميح ← حل، تصفية بالنوع/العمر).
  • 94 سؤال اختيار من متعدد → content/quiz.js تُعرَض في quiz.html («اختبارات تعليمية»: جلسة 10 أسئلة بخياراتٍ مخلوطة ونتيجةٍ فوريّة).

التقنية: نفس نمط المشروع — صفحةٌ واحدةٌ لكلّ نشاط (HTML + <style> بنفس لوحة الألوان + <script type="module"> يستورد JSON محليًّا)، مُسجَّلة في vite.config.js (مدخلات tales/puzzles/quiz) ومربوطة من home.html وplay.html. تعمل دون اتصال (الـ JSON يُضمَّن في الحزمة، والـ Service Worker يُسبِق-تخزينه). النصوص منقولةٌ حرفيًّا من GT-SARARIM ← تنطبق GPL-3.0 عند التوزيع (انظر CREDITS.md).

🎨 التخصيصُ والتحفيزُ والمناسبات (v1.7 — أصيلة، محلّيّةٌ بالكامل)

حزمةُ ميزاتٍ تجعلُ التجربةَ شخصيّةً ومحفّزةً وواعيةً بالسياق، دونَ أيِّ خادمٍ أو ذكاءٍ وقتَ التشغيل:

  • تخصيصُ الآليّsrc/robo-custom.js يحفظُ لكلِّ حسابٍ (localStorage) لونًا واسمًا وملحقًا. اللونُ يُطبَّقُ بمتغيّرِ CSS --robo-body على الجذر فيَشملُ كلَّ نسخِ الآليّ بقاعدةٍ واحدة .rc-body. ثمانيةُ ألوانٍ + اسمٌ اختياريّ + 10 ملحقاتٍ (accessory) تُفتَحُ تصاعديًّا بعددِ الأنشطةِ المُنجَزة (3→50)، تُرسَمُ بإحداثيّاتِ viewBox 0 0 80 80 وتُحقَنُ في <g class="rc-acc">. النافذةُ src/robo-custom-ui.js بمعاينةٍ حيّة؛ robo.refresh() يُحدّثُ المرافقَ العائم. (المُعرّفاتُ اللاتينيّةُ accessory؛ العرضُ العربيُّ «ملحقات».)
  • التحفيزُ اليوميّ — في home.html: حلقةُ الهدفِ (conic-gradient مدفوعةٌ بـ--pg) تُظهِرُ نسبةَ مهامِّ اليوم، وشعلةُ 🔥 بعددِ الأيّامِ المتتالية (streak من getStats()، كان محسوبًا لكنّه غيرُ معروضٍ قبلَ v1.7).
  • وصولُ الصغارتنقّلٌ صوتيّ (isVoiceNavOn): بطاقةُ الفهرسِ تَنطِقُ اسمَها عند أوّلِ نقرةٍ ونقرةٌ ثانيةٌ تَدخُلُها (لغيرِ القارئ). اهتزازٌ لطيف (haptic() في src/sfx.js عبرَ navigator.vibrate، صلاحيّةُ VIBRATE تُحقَنُ في التحزيم). كلُّ الحركاتِ داخلَ @media (prefers-reduced-motion: no-preference).
  • وضعُ الاستماعِ الليليّ (isNightMode) — فلترٌ كهرمانيٌّ دافئٌ على html.night-mode (في src/dark.css)، يُطبَّقُ على كلِّ صفحةٍ عبرَ أثرِ استيرادِ sound-prefs.
  • دليلُ الوالدcontent/parent-guide.js: لكلِّ نشاطٍ (12) «لماذا؟ · كيفَ في الواقع؟ · نصيحة» — يجسّدُ مبدأَ «الشاشةُ محفّزٌ لا معلّم». نافذةٌ في لوحةِ الأهل عبرَ src/parent-guide-ui.js.
  • بانرُ المناسباتsrc/occasions.js: تحويلٌ هجريٌّ حسابيٌّ جدوليٌّ محلّيٌّ (بلا مكتبة) يعرضُ تهنئةً في أيّامِ رمضان/العيدَين/عرفة/عشرِ ذي الحجّة/عاشوراء/رأسِ السنة. تقريبيٌّ للتهنئةِ لا للعبادة (انظر pitfalls-and-solutions.md).

♛♟️ لعبتا المهارةِ التنافسيّتان (v1.7 · بديلانِ لألعابِ النرد)

لعبتانِ رقميّتانِ كاملتانِ في play.html (صنف «ترفيهيّة»)، مندمجتانِ مع إطارِ التنافسِ versus (ضدّ الآليِّ بثلاثِ صعوبات/الإخوة/الوالد + «⏱️ ضدّ الوقت» + «وحدي» + سجلُّ الانتصارات + تعليمٌ عصبيّ):

  • الدَّامة (dama) — لوحةُ 8×8 على المربّعاتِ الداكنة، 12 قرصًا لكلِّ لاعب؛ حركةٌ قُطريّةٌ للأمام، أسرٌ بالقفزِ (متتابعٌ في دورٍ واحد)، ترقيةٌ إلى «دامة» ♛ عند بلوغِ الصفِّ الأخير. آليٌّ: سهل (عشوائيّ) · متوسّط (يُفضّلُ الأسر) · صعب (تقييمُ لوحةٍ + تجنّبُ إهداءِ أسر).
  • الشطرنج (chess)محرّكٌ كاملٌ مكتوبٌ من الصفرِ (محلّيٌّ 100%، بلا مكتبات): توليدُ الحركاتِ الشرعيّةِ لكلِّ القطع + كشفُ الكِشّ/المات/تعادلِ الجمود + التبييت (لا يعبرُ كِشًّا) + الأخذُ بالتجاوز + ترقيةُ البيدق (وزيرٌ تلقائيًّا). آليٌّ بمينيماكس + قطعِ ألفا-بيتا بثلاثِ أعماق (سهل/متوسّط/صعب)، بترتيبِ الأسرِ أوّلًا للكفاءة. القطعُ برموزِ يونيكود (أبيضُ عاجيٌّ · أسودُ مصمت)؛ الأبيضُ (اللاعبُ 0) يبدأُ دائمًا. الحركاتُ الشرعيّةُ بنقاطٍ متوهّجة، والأسرُ بحلقةٍ حمراء، والمَلِكُ يُبرَزُ عندَ الكِشّ.

مزلق (v1.7): مربّعاتُ الأسرِ في الشطرنجِ لم تكنْ تُبرَز (النقطةُ الخضراءُ على المربّعِ الفارغِ فقط)، ونقاطُ الحركةِ على المربّعاتِ الداكنةِ كانت منخفضةَ التباين — أُصلِحَ بحلقةِ أسرٍ حمراءَ ونقاطٍ متوهّجةٍ (نواةٌ ساطعةٌ + هالةٌ + حلقةٌ بيضاء).


❓ أسئلة فرعية مفتوحة

  • نموذج إنتاج المحتوى: مكتبة مُعَدّة مسبقًا ✅ (2026-06-10).
  • الإطار/البناء: Vite + vite-plugin-pwa للإنتاج ✅ — والنسخة القديمة بلا بناء في app/.
  • يعمل دون اتصال + قابل للتثبيت (Service Worker عبر vite-plugin-pwa) ✅.
  • صوت الآليّ: تسجيل بشريّ أم TTS المتصفح.
  • لوحة الأهل (بوّابة + مراجعة + ضبط مجالات) والتقاط الصوت/الصورة محليًّا في IndexedDB ✅.
  • المطبوعات: بطاقات المهام + ملصق «خريطة شفاء الآليّ» (طباعة/PDF عبر المتصفح) ✅ (app/print.html).
  • صياغة مخطّط المحتوى ونموذج الشفاء ✅ (docs/content-format.md).
  • مكتبة المحتوى: 71 ذكرية (9 مشاريع، 5 موسميّة، 6 تعاونيّة، 5 مهارات حياتية، 5 أمان وصحّة، 5 قدوات وقيم مستوحاة من GT-SARARIM، تغطية كاملة لنموذج الشفاء) ✅ (content/library.js) — قابلة للنمو. الاقتباس موثّق في docs/CREDITS.md.

Clone this wiki locally