commit 8fe818e6470714247073a419c0ab9af1898c09fa Author: Ahmed Date: Fri Oct 2 12:46:11 2026 +0300 Initial site release diff --git a/.github/workflows/deploy-pages.yml b/.github/workflows/deploy-pages.yml new file mode 100644 index 0000000..5ed7bb4 --- /dev/null +++ b/.github/workflows/deploy-pages.yml @@ -0,0 +1,47 @@ +name: Deploy GitHub Pages + +on: + push: + branches: [main] + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: true + +jobs: + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Validate site + run: python3 scripts/check_site.py + + - name: Prepare static site + run: | + mkdir -p _site + cp ./*.html _site/ + cp -R assets _site/assets + touch _site/.nojekyll + + - name: Configure Pages + uses: actions/configure-pages@v5 + + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v3 + with: + path: _site + + - name: Deploy + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..00d5f4f --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# OpenDesign working data +.od-skills/ +.file-versions/ +*.artifact.json + +# Generated previews +preview*.png +*-preview.png +screenshot-*.png + +# Local OS/editor files +.DS_Store +.vscode/ +.idea/ diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/IMG-20261001-WA0004.jpg b/IMG-20261001-WA0004.jpg new file mode 100644 index 0000000..7643a3c Binary files /dev/null and b/IMG-20261001-WA0004.jpg differ diff --git a/README.md b/README.md new file mode 100644 index 0000000..54e6195 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +# أنور بي آي + +موقع عربي ثابت لتعلّم الذكاء الاصطناعي، جاهز للنشر على GitHub Pages. + +## النشر + +1. أنشئ مستودع GitHub وارفع هذا المجلد إلى فرع `main`. +2. افتح **Settings → Pages** في المستودع. +3. اختر **GitHub Actions** ضمن **Build and deployment → Source**. +4. سيعمل مسار `Deploy GitHub Pages` تلقائياً عند كل دفع إلى `main`. + +يمكن تشغيل فحص الموقع محلياً قبل الدفع: + +```bash +python3 scripts/check_site.py +``` + +## حدود النسخة الحالية + +الموقع واجهة ثابتة فقط. تسجيل الدخول، استعادة كلمة المرور، الدفع، العضوية، وحماية محتوى VIP محاكاة داخل المتصفح وليست حماية إنتاجية. لا تستخدمه لجمع بيانات حقيقية قبل إضافة مصادقة وتفويض ودفع من جهة الخادم. diff --git a/account-settings.html b/account-settings.html new file mode 100644 index 0000000..74f12a1 --- /dev/null +++ b/account-settings.html @@ -0,0 +1,305 @@ + + + + + + + + + إعدادات الحساب — أنور بي آي + + + + + +

نموذج تجريبي: مشترك فعّال — غيّر كلمة المرور والتفضيلات، وجرّب الإلغاء. البيانات لا تُرسل لأي خادم.

+
+
+
+

حسابك في أنور بي آي

+

إعدادات الحساب

+

ahmed@example.com · عضو منذ مارس ٢٠٢٥

+
+
+ + +
+
+

الملف الشخصي

+

الاسم كما يظهر في تعليقاتك وقوائم الحفظ. البريد الإلكتروني هو معرّف الدخول ولا يتغير من هنا.

+
+
+
لتغيير البريد تواصل معنا على hello@anwarpi.ai
+ +

+
+
+ +
+

تغيير كلمة المرور

+

بعد التغيير تبقى جلستك الحالية مفتوحة، وتُطلب كلمة المرور الجديدة عند الدخول من جهاز آخر.

+
+
+
+
    +
  • ٨ أحرف على الأقل
  • +
  • تحتوي رقماً واحداً على الأقل
  • +
  • تختلف عن كلمة المرور الحالية
  • +
+
+ +

+
+
+ +
+

التفضيلات

+

رسائل أنور بي آي قليلة ومقصودة. يمكنك إيقاف أي نوع منها من دون التأثير على عضويتك.

+
+
الرسالة الأسبوعية

خلاصة ما نُشر من أدلة ومقالات، كل يوم أحد.

+
إشعارات التعليقات

رسالة عند ردّ أحد الأعضاء على تعليقك.

+
تحديثات الأدلة المحفوظة

إشعار عندما يُحدَّث دليل حفظته للعودة إليه.

+
+ +

+
+ +
+

العضوية والفوترة

+

خطتك، موعد التجديد، وطريقة الدفع. الإلغاء يوقف التجديد التالي ويحفظ وصولك حتى نهاية الفترة المدفوعة.

+
+
+

عضوية فردية

بدأت في ١ أكتوبر ٢٠٢٦
+ نشطة +
+
+
٤٩ ر.سشهرياً
+
التجديد القادم
١ نوفمبر ٢٠٢٦
+
طريقة الدفع
Visa •••• 4242
+
الوصول بعد الإلغاء
حتى نهاية الفترة المدفوعة
+
+
+ + +
+
+
+

إلغاء الاشتراك

+

لن يُجدَّد اشتراكك في ١ نوفمبر ٢٠٢٦. تبقى عضويتك مفتوحة حتى ذلك التاريخ، ويبقى حسابك المجاني ومقالاتك المحفوظة بعدها.

+ +
+
+

سجل الفواتير

+

كل دفعة تُصدر فاتورة ضريبية فور اكتمالها وترسل إلى بريدك المسجّل. الفواتير متاحة للتنزيل في أي وقت.

+
+
+ التاريخالوصفالمبلغالحالةالفاتورة +
+
+ ١ نوفمبر ٢٠٢٦ + تجديد شهري — عضوية فردية + ٤٩ ر.س + قادمة + — +
+
+ ١ أكتوبر ٢٠٢٦ + عضوية فردية · أول اشتراك + ٤٩ ر.س + + +
+
+
+
+
+
+
+ + + + + + + + diff --git a/arabic-ai-learning-catalog-v2.html b/arabic-ai-learning-catalog-v2.html new file mode 100644 index 0000000..f10584b --- /dev/null +++ b/arabic-ai-learning-catalog-v2.html @@ -0,0 +1,465 @@ + + + + + + + + + أنور بي آي — تعلّم الذكاء الاصطناعي بوضوح + + + + + +
+
+ + + +
+
+ +
+
+
+
+

مكتبة عربية عملية · AI + AGENTS

+

افهم الذكاء الاصطناعي. ثم ابنِ به.

+

أدلة واضحة، دروس فيديو، ومسارات متدرجة تساعدك على الانتقال من الفكرة إلى وكيل يعمل.

+ +

بالعربية أولاً · أمثلة قابلة للتطبيق · تحديثات مرتبطة بما يتغير فعلاً

+
+ +
+
+
+
دليل حصري · المستوى المتوسط01
+

ابنِ وكيلك الأول دون فوضى

خريطة عملية لتقسيم المهام، اختيار الأدوات، وضبط ذاكرة الوكيل قبل كتابة الكود.

+
فيديو · 28 دقيقةAGENTIC AI
+
+
+
مقال تطبيقي · للمبتدئين02
+

كيف تختار نموذجاً لمهمتك؟

مقارنة منهجية حسب الجودة، التكلفة، السرعة، والخصوصية — من دون ضجيج تسويقي.

+
قراءة · 12 دقيقةالنماذج
+
+
+
مسار متقدم · للأعضاء03
+

من RAG إلى إجابة موثوقة

صمّم الاسترجاع، اختبر المصادر، وافهم أين تنهار الإجابة قبل أن تصل إلى المستخدم.

+
سلسلة · 4 أجزاءRAG
+
+
+
+
+ + + +
+
+ + +
+
+
+
+
+ +
+
+
+

ابدأ من اهتمامك

أربعة مسارات. هدف واحد: فهم قابل للاستخدام.

+

تصفح المحتوى حسب ما تريد بناءه، لا حسب المصطلحات التي تحفظها.

+
+ +
+
+ +
+
+
+

مختارات المحررين

دليل تقرؤه اليوم، وتستخدمه غداً.

+ محتوى عربي · نص وفيديو +
+
+ + + + + +
+ +
+
+
دليل عملي · حصريتشريح وكيل ناجح
+
الوكلاء18 دقيقة
+

البنية التي تمنع وكيلك من الدوران في حلقة

+

حدود واضحة بين التخطيط، التنفيذ، والتحقق مع نموذج بسيط لسجلّ الحالة.

+ شاهد المعاينة← +
+ +
+
مقال · مجانيخريطة اختيار النموذج
+
النماذج12 دقيقة
+

لا تبدأ باسم النموذج؛ ابدأ بطبيعة المهمة

+

مصفوفة قرار عملية توازن بين الدقة، السياق، السرعة، والكلفة.

+ ابدأ القراءة← +
+ +
+
فيديو · حصريراقب قبل أن تؤتمت
+
الأتمتة24 دقيقة
+

كيف تكتشف فشل سير العمل قبل المستخدم؟

+

إشارات قليلة تكفي لمراقبة التكلفة، التأخير، ونقاط الانقطاع.

+ +
+ +
+
شرح · مجانيالسياق قبل البرومبت
+
الأساسيات9 دقائق
+

لماذا لا يصلح تحسين الصياغة بياناتك الرديئة؟

+

افصل بين التعليمات، المعرفة، وذاكرة المحادثة لتحصل على نتيجة مستقرة.

+ +
+ +
+
قائمة فحص · حصريأدوات بلا مفاجآت
+
الوكلاء15 دقيقة
+

قبل أن تمنح الوكيل صلاحية التنفيذ

+

حدود الصلاحيات، التأكيد البشري، وسجل تدقيق يمكنك الرجوع إليه.

+ +
+ +
+
سلسلة فيديو · حصريقياس RAG بصدق
+
النماذج4 أجزاء
+

اختبر الاسترجاع والإجابة كلّاً على حدة

+

منهج تقييم يفصل فشل المصدر عن فشل النموذج ويقودك إلى إصلاح صحيح.

+ +
+
+

لا توجد مواد في هذا المسار حالياً.

+
+
+ +
+
+
+

عضوية أنور بي آي

+

المحتوى الذي يحترم وقتك يبقى معك.

+

وصول إلى الأدلة المتقدمة، مسارات الفيديو، والملفات العملية عند إضافتها.

+
+
+
    +
  • الأدلة الحصريةكاملة
  • +
  • مسارات الفيديومتدرجة
  • +
  • ملفات العملقابلة للتنزيل
  • +
+ +
+
+
+
+ + + + + + + + + + diff --git a/arabic-ai-learning-catalog.html b/arabic-ai-learning-catalog.html new file mode 100644 index 0000000..66f70be --- /dev/null +++ b/arabic-ai-learning-catalog.html @@ -0,0 +1,529 @@ + + + + + + + + + أنور بي آي — تعلّم الذكاء الاصطناعي بوضوح + + + + + +
+ +
+ +
+
+
+
+

مكتبة عربية عملية · AI + AGENTS

+

افهم الذكاء الاصطناعي. ثم ابنِ به.

+

أدلة واضحة، دروس فيديو، ومسارات متدرجة تساعدك على الانتقال من الفكرة إلى وكيل يعمل.

+ +

بالعربية أولاً · أمثلة قابلة للتطبيق · تحديثات مرتبطة بما يتغير فعلاً

+
+ +
+
+
+
دليل حصري · المستوى المتوسط01
+

ابنِ وكيلك الأول دون فوضى

خريطة عملية لتقسيم المهام، اختيار الأدوات، وضبط ذاكرة الوكيل قبل كتابة الكود.

+
فيديو · 28 دقيقةشاهد المعاينة ←
+
+
+
مقال تطبيقي · للمبتدئين02
+

كيف تختار نموذجاً لمهمتك؟

مقارنة منهجية حسب الجودة، التكلفة، السرعة، والخصوصية — من دون ضجيج تسويقي.

+
قراءة · 12 دقيقةابدأ القراءة ←
+
+
+
مسار متقدم · للأعضاء03
+

من RAG إلى إجابة موثوقة

صمّم الاسترجاع، اختبر المصادر، وافهم أين تنهار الإجابة قبل أن تصل إلى المستخدم.

+
سلسلة · 4 أجزاءشاهد للأعضاء ←
+
+
+
+
+ + + +
+
+ + +
+
+
+
+
+ +
+
+
+

ابدأ من اهتمامك

أربعة مسارات. هدف واحد: فهم قابل للاستخدام.

+

تصفح المحتوى حسب ما تريد بناءه، لا حسب المصطلحات التي تحفظها.

+
+ +
+
+ +
+
+
+

مختارات المحررين

دليل تقرؤه اليوم، وتستخدمه غداً.

+ محتوى عربي · نص وفيديو +
+
+ + + + + +
+ +
+
+
دليل عملي · حصريتشريح وكيل ناجح
+
الوكلاء18 دقيقة
+

البنية التي تمنع وكيلك من الدوران في حلقة

+

حدود واضحة بين التخطيط، التنفيذ، والتحقق مع نموذج بسيط لسجلّ الحالة.

+ شاهد المعاينة← +
+ +
+
مقال · مجانيخريطة اختيار النموذج
+
النماذج12 دقيقة
+

لا تبدأ باسم النموذج؛ ابدأ بطبيعة المهمة

+

مصفوفة قرار عملية توازن بين الدقة، السياق، السرعة، والكلفة.

+ ابدأ القراءة← +
+ +
+
فيديو · حصريراقب قبل أن تؤتمت
+
الأتمتة24 دقيقة
+

كيف تكتشف فشل سير العمل قبل المستخدم؟

+

إشارات قليلة تكفي لمراقبة التكلفة، التأخير، ونقاط الانقطاع.

+ +
+ +
+
شرح · مجانيالسياق قبل البرومبت
+
الأساسيات9 دقائق
+

لماذا لا يصلح تحسين الصياغة بياناتك الرديئة؟

+

افصل بين التعليمات، المعرفة، وذاكرة المحادثة لتحصل على نتيجة مستقرة.

+ +
+ +
+
قائمة فحص · حصريأدوات بلا مفاجآت
+
الوكلاء15 دقيقة
+

قبل أن تمنح الوكيل صلاحية التنفيذ

+

حدود الصلاحيات، التأكيد البشري، وسجل تدقيق يمكنك الرجوع إليه.

+ +
+ +
+
سلسلة فيديو · حصريقياس RAG بصدق
+
النماذج4 أجزاء
+

اختبر الاسترجاع والإجابة كلّاً على حدة

+

منهج تقييم يفصل فشل المصدر عن فشل النموذج ويقودك إلى إصلاح صحيح.

+ +
+
+

لا توجد مواد في هذا المسار حالياً.

+
+
+ +
+
+
+

عضوية أنور بي آي

+

المحتوى الذي يحترم وقتك يبقى معك.

+

وصول إلى الأدلة المتقدمة، مسارات الفيديو، والملفات العملية عند إضافتها.

+
+
+
    +
  • الأدلة الحصريةكاملة
  • +
  • مسارات الفيديومتدرجة
  • +
  • ملفات العملقابلة للتنزيل
  • +
+ شاهد الأسعار والمزايا +
+
+
+
+ + + + + + + + + + + + diff --git a/article-agent-guide.html b/article-agent-guide.html new file mode 100644 index 0000000..2ee8be9 --- /dev/null +++ b/article-agent-guide.html @@ -0,0 +1,78 @@ + + + + + + + + + ابنِ وكيلك الأول دون فوضى — أنور بي آي + + + + + +
+
+
مقال مجاني · متاح بالكامل

الوكلاء · دليل عملي

ابنِ وكيلك الأول دون فوضى

خريطة عملية تفصل التخطيط عن التنفيذ والتحقق، حتى تعرف لماذا نجح الوكيل — ولماذا فشل.

+
+
+

الوكيل الجيد ليس محادثة أطول. هو نظام صغير يعرف ما المطلوب، يختار أداة مناسبة، ثم يتحقق من النتيجة قبل أن يكمل.

+

أغلب التجارب الأولى تفشل لأن كل شيء يحدث داخل تعليمات واحدة: الهدف، والبيانات، والأدوات، والذاكرة. عندما يتعثر النظام لا تعرف هل المشكلة في الفهم أم التنفيذ أم التحقق. الحل ليس إضافة تعليمات أكثر؛ بل فصل المسؤوليات.

+

١. اكتب نتيجة يمكن فحصها

+

ابدأ بما يجب أن يكون صحيحاً عند النهاية. «ابحث عن أفضل خيار» هدف ضبابي. أما «أنشئ قائمة من ثلاثة خيارات، مع المصدر والسعر وتاريخ التحقق» فيمكن اختباره.

+
قاعدة أنور بي آيإذا لم تستطع كتابة اختبار بسيط للنتيجة، فلن يعرف الوكيل متى يتوقف.
+

٢. استخدم حلقة قصيرة وواضحة

+
  1. خطّط

    حوّل الهدف إلى خطوة واحدة تالية، لا إلى خطة ضخمة لا تتغير.

  2. نفّذ

    استدعِ أداة واحدة بمدخلات محددة وسجّل ما حدث فعلاً.

  3. تحقق

    قارن الناتج بشرط النجاح، ثم توقف أو عدّل الخطوة التالية.

+
while not done:
+    step = planner.next(goal, state)
+    result = tools.run(step)
+    state.record(result)
+    done = verifier.check(goal, state)
+

٣. اجعل الأدوات ضيقة الصلاحية

+

لا تمنح الوكيل أداة «نفّذ أي أمر». قدّم وظائف محددة مثل قراءة ملف، إنشاء مسودة، أو إرسال عنصر بعد موافقة. كلما ضاقت الأداة أصبح اختبارها ومراجعتها أسهل.

+
  • تحقق من المدخلات قبل التنفيذ.
  • اطلب موافقة بشرية قبل الإرسال أو الحذف أو الدفع.
  • احتفظ بسجل واضح للطلب والنتيجة.
+

٤. الذاكرة ليست صندوقاً واحداً

+

احتفظ بحالة المهمة الحالية منفصلة عن المعرفة طويلة المدى. لا ترسل تاريخ المحادثة كله في كل مرة. استخرج فقط ما يحتاجه القرار التالي، واحتفظ بالمصادر بجوار الحقائق.

+

قائمة الفحص قبل التشغيل

+
  • هل توجد نتيجة نهائية قابلة للتحقق؟
  • هل لكل أداة مدخلات وصلاحيات محددة؟
  • هل يستطيع الوكيل التوقف عند الفشل؟
  • هل العمليات الحساسة تحتاج موافقة؟
  • هل يمكنك إعادة تشغيل المهمة من السجل؟
+
الخلاصةابدأ بحلقة صغيرة واختبار واحد. أضف الذاكرة والتخطيط المتقدم فقط عندما يثبت القياس أنك تحتاجهما.
+
+ +
+

نقاش هادئ ومفيد

التعليقات

كن أول من يضيف تعليقاً على هذا الدليل.

+ +
+ + + + + \ No newline at end of file diff --git a/assets/anwarpi-logo.jpg b/assets/anwarpi-logo.jpg new file mode 100644 index 0000000..7643a3c Binary files /dev/null and b/assets/anwarpi-logo.jpg differ diff --git a/assets/anwarpi.css b/assets/anwarpi.css new file mode 100644 index 0000000..80714ce --- /dev/null +++ b/assets/anwarpi.css @@ -0,0 +1,194 @@ +/* ============================================================ + AnwarPi — shared motion & brand layer + Loaded after each page's inline styles; tokens stay in-page. + ============================================================ */ + +/* ---- Shared palette: cool light on deep blue-black ---- */ +:root { + --bg: oklch(16% 0.03 225); + --surface: oklch(22% 0.04 220); + --fg: oklch(96% 0.015 210); + --muted: oklch(74% 0.03 215); + --border: oklch(36% 0.05 215); + --accent: oklch(78% 0.17 190); +} + +/* ---- Shared responsive safeguards ---- */ +html, body { max-width: 100%; overflow-x: clip; } +img, svg, video { height: auto; } +main, section, .container, .grid, [class*="grid"], [class*="layout"] { min-width: 0; } +code, pre, bdi { overflow-wrap: anywhere; } +pre, table { max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; } +:focus-visible { outline-color: var(--accent); } + +@media (pointer: coarse) { + a, button, input, select, textarea, summary, .btn, .icon-btn { min-height: 44px; } +} + +@media (max-width: 920px) { + :root { --gutter: 22px; } + .container { width: 100%; } + + /* Keep primary navigation visible on phones and tablets. */ + .topnav .nav-inner, + .topnav .topnav-inner { + flex-wrap: wrap; + gap: 0 16px; + padding-top: 10px; + } + .topnav .logo, + .topnav .nav-tools { margin-bottom: 10px; } + .topnav .logo { min-height: 50px; } + input, select, textarea { min-height: 48px; font-size: 16px; } + .footer-col a { min-height: 44px; display: flex; align-items: center; } + .section-head { gap: 20px; } + .demo-strip { padding-inline: var(--gutter); } + .table-wrap, .billing-table { max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; } + .topnav .nav-links, + .topnav .topnav-inner > nav { + display: flex; + order: 3; + flex: 0 0 calc(100% + (var(--gutter) * 2)); + gap: 8px; + margin-inline: calc(var(--gutter) * -1); + padding-inline: var(--gutter); + overflow-x: auto; + overscroll-behavior-inline: contain; + scrollbar-width: none; + border-top: 1px solid var(--border); + } + .topnav .nav-links::-webkit-scrollbar, + .topnav .topnav-inner > nav::-webkit-scrollbar { display: none; } + .topnav .nav-links a, + .topnav .topnav-inner > nav a { + flex: none; + min-height: 52px; + padding-inline: 12px; + white-space: nowrap; + position: relative; + } + .topnav a[aria-current="page"] { + position: relative; + color: var(--fg); + font-weight: 700; + } + .topnav a[aria-current="page"]::after { + content: ""; + position: absolute; + inset-inline: 12px; + bottom: 5px; + height: 3px; + border-radius: 999px; + background: var(--accent); + } + .topnav .nav-links + .nav-tools .menu-trigger, + .topnav .topnav-inner > nav + .nav-tools .menu-trigger { display: none; } + + .menu-drawer { width: min(520px, 92vw); } + .dialog-card, .modal-card { max-width: calc(100vw - 36px); max-height: calc(100dvh - 36px); overflow-y: auto; } +} + +@media (max-width: 620px) { + :root { --gutter: 18px; } + body { line-height: 1.7; } + h1 { font-size: clamp(38px, 11vw, 50px) !important; overflow-wrap: normal; word-break: normal; } + h2 { overflow-wrap: normal; word-break: normal; } + .topnav .logo { font-size: 20px; } + .topnav .nav-return { display: inline-flex !important; min-height: 44px; align-items: center; font-size: 13px; padding-inline: 4px; } + .topnav .nav-inner, + .topnav .topnav-inner { gap: 0 10px; } + .topnav .nav-links, + .topnav .topnav-inner > nav { gap: 4px; } + .topnav .nav-links a, + .topnav .topnav-inner > nav a { padding-inline: 10px; } + .hero-cta, .dialog-actions, .form-actions { align-items: stretch; gap: 12px; } + .hero-cta .btn, .dialog-actions .btn, .form-actions .btn { width: 100%; } + .pagefoot { padding-block: 40px; } + .footer-bottom { gap: 12px; } + .card, .membership-card, .paywall, .plan, .team-contact { padding-inline: 20px; } + .dialog-card, .modal-card, .dialog-panel, .modal-panel { max-width: calc(100vw - 28px); } +} + +/* ---- Brand mark: real logo image replaces the geometric span ---- */ +img.logo-mark { + width: 30px; + height: 34px; + object-fit: contain; + transform: none; + background: none; + border-radius: 4px; + flex: none; +} + +/* ---- Text selection on dark canvas ---- */ +::selection { background: color-mix(in oklch, var(--accent) 28%, transparent); } + +/* ---- Button hover: light-sweep + lift (AnwarPi "light" motif) ---- */ +@media (prefers-reduced-motion: no-preference) { + .btn, .btn-primary, .btn-secondary, .btn-ghost, .icon-btn { + position: relative; + overflow: hidden; + transition: transform .18s ease, box-shadow .18s ease, background-color .18s ease, border-color .18s ease, color .18s ease; + } + .btn::after, .btn-primary::after, .btn-secondary::after, .btn-ghost::after, .icon-btn::after { + content: ""; + position: absolute; + inset-block: 0; + inset-inline-start: -45%; + width: 34%; + background: linear-gradient(100deg, transparent 0%, rgba(255, 255, 255, 0.45) 50%, transparent 100%); + transform: skewX(-18deg); + opacity: 0; + pointer-events: none; + } + .btn:hover::after, .btn-primary:hover::after, .btn-secondary:hover::after, + .btn-ghost:hover::after, .icon-btn:hover::after { + animation: anw-sweep 0.85s cubic-bezier(0.4, 0, 0.2, 1); + } + .btn:hover, .btn-primary:hover, .btn-secondary:hover, .btn-ghost:hover, .icon-btn:hover { + transform: translateY(-1px); + } + .btn-primary:hover, .btn:hover { + box-shadow: 0 8px 28px color-mix(in oklch, var(--accent) 30%, transparent); + } + .btn:active, .btn-primary:active, .btn-secondary:active, .btn-ghost:active, .icon-btn:active { + transform: translateY(0); + } +} +@keyframes anw-sweep { + 0% { opacity: 1; inset-inline-start: -45%; } + 100% { opacity: 1; inset-inline-start: 118%; } +} + +/* ---- Scroll reveal (driven by anwarpi.js) ---- */ +[data-anw] { + transition: opacity 0.7s ease, transform 0.7s cubic-bezier(0.16, 1, 0.3, 1); +} +.anw-anim [data-anw]:not(.anw-in) { + opacity: 0; + transform: translateY(18px); +} + +/* ---- WebGL canvas sits behind everything, above the root background ---- */ +#anwarpi-bg { + position: fixed; + inset: 0; + width: 100%; + height: 100%; + z-index: -1; + pointer-events: none; + transition: opacity 0.9s ease; +} + +/* ---- Hero brand mark: the beam logo, black field dissolved into the canvas ---- */ +.hero-logo { + display: block; + width: 68px; + height: auto; + border-radius: 6px; + mix-blend-mode: screen; /* drops the jpg's black field — only the beams glow */ + margin-block-end: 26px; +} + +/* ---- Dark-theme correction: scrims must dim with black, not --fg (now white) ---- */ +.dialog-scrim, .menu-scrim, .modal { background: rgba(5, 5, 5, 0.68); } diff --git a/assets/anwarpi.js b/assets/anwarpi.js new file mode 100644 index 0000000..6bf1b44 --- /dev/null +++ b/assets/anwarpi.js @@ -0,0 +1,215 @@ +/* AnwarPi — WebGL light-beam background + scroll reveal. + Loads deferred on every page; no-ops gracefully if WebGL is unavailable. */ +(function () { + "use strict"; + var reduced = false; + try { reduced = window.matchMedia("(prefers-reduced-motion: reduce)").matches; } catch (e) {} + var staticMode = false; + try { staticMode = new URLSearchParams(location.search).has("static"); } catch (e) {} + + /* ================= WebGL beam field ================= */ + function initWebGL() { + var canvas = document.createElement("canvas"); + canvas.id = "anwarpi-bg"; + canvas.setAttribute("aria-hidden", "true"); + var first = document.body.firstChild; + if (first) document.body.insertBefore(canvas, first); + else document.body.appendChild(canvas); + + var gl = canvas.getContext("webgl", { antialias: false, alpha: false, depth: false, stencil: false }) + || canvas.getContext("experimental-webgl"); + if (!gl) { canvas.parentNode.removeChild(canvas); return; } + + var vertSrc = "attribute vec2 p;void main(){gl_Position=vec4(p,0.0,1.0);}"; + var fragSrc = [ + "precision highp float;", + "uniform float uTime;", + "uniform vec2 uRes;", + "uniform vec2 uMouse;", + "float hash(float n){return fract(sin(n*127.1)*43758.5453);}", + "void main(){", + " vec2 uv = gl_FragCoord.xy / uRes;", /* y: 0 bottom -> 1 top */ + " float t = uTime * 0.06;", + " float v = 0.0;", + /* vertical light beams — the AnwarPi "A" ray motif */ + " for(int i = 0; i < 7; i++){", + " float fi = float(i);", + " float x = 0.08 + 0.84 * hash(fi + 1.0) + 0.05 * sin(t * 0.7 + fi * 2.4);", + " x += (uMouse.x - x) * 0.16;", + " float w = 0.016 + 0.05 * hash(fi + 7.0);", + " float beam = exp(-pow((uv.x - x) / w, 2.0));", + " float flick = 0.55 + 0.45 * sin(t * 1.1 + fi * 1.7);", + " flick *= 1.0 + 0.55 * exp(-pow((uv.x - uMouse.x) / 0.24, 2.0));", + " float fade = smoothstep(1.0, 0.12, uv.y);", /* brighter toward the bottom, like the mark */ + " v += beam * flick * fade * (0.10 + 0.17 * hash(fi + 13.0));", + " }", + /* cursor halo — the light follows the visitor */ + " v += 0.11 * exp(-length((uv - uMouse) * vec2(1.0, 0.9)) * 4.5);", + /* broad floor glow + soft vignette */ + " v += 0.15 * exp(-uv.y * 2.4);", + " v *= smoothstep(1.3, 0.55, uv.y);", + " v = clamp(v, 0.0, 1.0);", + /* deep blue-black base, aligned with the shared --bg token */ + " vec3 base = vec3(0.0005, 0.0618, 0.0896);", + " gl_FragColor = vec4(base + vec3(v), 1.0);", + "}" + ].join("\n"); + + function compile(type, src) { + var s = gl.createShader(type); + gl.shaderSource(s, src); + gl.compileShader(s); + if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) { gl.deleteShader(s); return null; } + return s; + } + var vs = compile(gl.VERTEX_SHADER, vertSrc); + var fs = compile(gl.FRAGMENT_SHADER, fragSrc); + if (!vs || !fs) { canvas.parentNode.removeChild(canvas); return; } + var prog = gl.createProgram(); + gl.attachShader(prog, vs); gl.attachShader(prog, fs); gl.linkProgram(prog); + if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) { canvas.parentNode.removeChild(canvas); return; } + gl.useProgram(prog); + + var buf = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, buf); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 3, -1, -1, 3]), gl.STATIC_DRAW); + var loc = gl.getAttribLocation(prog, "p"); + gl.enableVertexAttribArray(loc); + gl.vertexAttribPointer(loc, 2, gl.FLOAT, false, 0, 0); + var uTime = gl.getUniformLocation(prog, "uTime"); + var uRes = gl.getUniformLocation(prog, "uRes"); + var uMouse = gl.getUniformLocation(prog, "uMouse"); + + /* ---- pointer reaction: beams lean toward the cursor, halo follows ---- */ + var mouseTX = 0.5, mouseTY = 0.55, mouseX = 0.5, mouseY = 0.55; + if (!reduced && !staticMode) { + window.addEventListener("pointermove", function (e) { + if (e.pointerType === "touch") return; + mouseTX = e.clientX / window.innerWidth; + mouseTY = 1 - e.clientY / window.innerHeight; + }, { passive: true }); + document.addEventListener("pointerleave", function () { + mouseTX = 0.5; mouseTY = 0.55; + }); + } + gl.uniform2f(uMouse, mouseX, mouseY); + + var DPR_CAP = 1.5; + function resize() { + var dpr = Math.min(window.devicePixelRatio || 1, DPR_CAP); + var w = Math.max(1, Math.floor(window.innerWidth * dpr)); + var h = Math.max(1, Math.floor(window.innerHeight * dpr)); + if (canvas.width !== w || canvas.height !== h) { + canvas.width = w; canvas.height = h; + gl.viewport(0, 0, w, h); + } + gl.uniform2f(uRes, canvas.width, canvas.height); + } + + var start = (window.performance && performance.now()) || 0; + function draw(now) { + mouseX += (mouseTX - mouseX) * 0.07; + mouseY += (mouseTY - mouseY) * 0.07; + gl.uniform1f(uTime, (now - start) / 1000); + gl.uniform2f(uMouse, mouseX, mouseY); + gl.drawArrays(gl.TRIANGLES, 0, 3); + } + + resize(); + draw(start); /* paint one frame synchronously so screenshots capture the field */ + + /* ---- article reading mode: fade the field down once past the header ---- */ + if (document.body.hasAttribute("data-anw-dim")) { + var first = document.querySelector("main") && document.querySelector("main").firstElementChild; + var dimFrom = first ? first.offsetHeight : 420; + var onScroll = function () { + canvas.style.opacity = (window.scrollY || 0) > dimFrom ? "0.22" : "1"; + }; + window.addEventListener("scroll", onScroll, { passive: true }); + onScroll(); + } + + if (reduced || staticMode) { + window.addEventListener("resize", function () { resize(); draw(start); }); + return; + } + var running = true; + function loop(now) { + if (running) { draw(now); } + window.requestAnimationFrame(loop); + } + window.requestAnimationFrame(loop); + document.addEventListener("visibilitychange", function () { + running = !document.hidden; + if (running) start = (window.performance && performance.now()) - 0; /* keep phase simple */ + }); + } + + /* ================= Scroll reveal ================= */ + function initReveal() { + if (reduced || staticMode) return; + var vh = window.innerHeight || 800; + var candidates = document.querySelectorAll( + "main section > .container > *, main > .container > *, main .container > .grid > *, main .grid > *" + ); + var seen = {}; + var targets = []; + for (var i = 0; i < candidates.length; i++) { + var el = candidates[i]; + if (seen[el.anwId]) continue; + if (el.closest(".menu-panel, .modal, dialog")) continue; + var r = el.getBoundingClientRect(); + if (r.top < vh * 0.92) continue; /* above the fold: show instantly, never hide */ + el.anwId = "anw" + i; + seen[el.anwId] = 1; + el.setAttribute("data-anw", ""); + el.style.transitionDelay = ((i % 3) * 70) + "ms"; + targets.push(el); + } + if (!targets.length) return; + document.documentElement.classList.add("anw-anim"); + /* Force reveal after a safety window so nothing can stay hidden */ + window.setTimeout(function () { + targets.forEach(function (el) { el.classList.add("anw-in"); }); + }, 3000); + if (!("IntersectionObserver" in window)) return; + var io = new IntersectionObserver(function (entries) { + entries.forEach(function (entry) { + if (entry.isIntersecting) { + entry.target.classList.add("anw-in"); + io.unobserve(entry.target); + } + }); + }, { threshold: 0.1, rootMargin: "0px 0px -8% 0px" }); + targets.forEach(function (el) { io.observe(el); }); + } + + /* ================= Current page in mobile navigation ================= */ + function initActiveNav() { + var topnav = document.querySelector(".topnav"); + if (!topnav) return; + + var page = (location.pathname.split("/").pop() || "index.html").toLowerCase(); + var selector = { + "index.html": ".logo", + "arabic-ai-learning-catalog.html": "nav a[href^='#catalog']", + "arabic-ai-learning-catalog-v2.html": "nav a[href^='#catalog']", + "article-agent-guide.html": "nav a[href='article-agent-guide.html']", + "post-locked.html": "nav a[href='article-agent-guide.html']", + "post-unlocked.html": "nav a[href='article-agent-guide.html']", + "subscription.html": "nav a[href='#exclusive-guides']", + "vip-onboarding.html": "nav a[href='subscription.html']", + "account-settings.html": ".nav-account", + "login.html": ".logo", + "forgot-password.html": ".logo", + "privacy.html": "nav a[href='privacy.html']" + }[page]; + + var active = selector && topnav.querySelector(selector); + if (active) active.setAttribute("aria-current", "page"); + } + + function boot() { initActiveNav(); initWebGL(); initReveal(); } + if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", boot); + else boot(); +})(); diff --git a/brand-spec.md b/brand-spec.md new file mode 100644 index 0000000..3941863 --- /dev/null +++ b/brand-spec.md @@ -0,0 +1,25 @@ +# أنور بي آي (AnwarPi) — Brand specification + +```css +:root { + --bg: oklch(16% 0.03 225); /* deep blue-black canvas */ + --surface: oklch(22% 0.04 220); /* raised blue-black cards */ + --fg: oklch(96% 0.015 210); /* cool white, matching the beam highlight */ + --muted: oklch(74% 0.03 215); /* readable cool gray-blue */ + --border: oklch(36% 0.05 215); /* visible blue-gray hairlines */ + --accent: oklch(78% 0.17 190); /* vivid cyan-teal action color */ + --font-display: "SF Arabic", "Noto Sans Arabic", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + --font-body: "SF Arabic", "Noto Sans Arabic", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + --font-mono: ui-monospace, "SF Mono", Menlo, monospace; +} +``` + +- The logo remains the anchor: a black field and silver-white beams, now placed in a cool blue-black environment rather than an all-gray page. +- The mark (`assets/anwarpi-logo.jpg`) is a light-ray "A": bright near-white at its base fading to dim gray at the apex — mirrored by the WebGL background (rising beams, brighter toward the bottom). +- Dark-first layouts: cool-white text on blue-black, clearly separated surfaces, and visible blue-gray rules. +- The single accent is cyan-teal: primary controls gain an unmistakable action color while white remains reserved for content and the logo beams. +- Inverted panels (demo strips, membership block) flip to `--fg` background with `--surface` text; scrims dim with black, never white. +- Latin technical terms and numerics are directionally isolated with `bdi`. +- Motion layer is shared: `assets/anwarpi.css` + `assets/anwarpi.js` (WebGL beam field, IntersectionObserver reveals, light-sweep hovers). Both respect `prefers-reduced-motion`; append `?static` to disable animation for captures. + +أنور بي آي هو نظام داكن واضح: خلفية زرقاء سوداء، وأشعة فضية من الشعار، ولمسة سماوية تركوازية توجه العين نحو الأفعال المهمة دون ضوضاء. diff --git a/forgot-password.html b/forgot-password.html new file mode 100644 index 0000000..e442904 --- /dev/null +++ b/forgot-password.html @@ -0,0 +1,34 @@ + + + + + + + + + استعادة كلمة المرور — أنور بي آي + + + + + +
+

استعادة الحساب

أرسل رابطاً جديداً.

أدخل بريد حسابك وسنجهّز طلب إعادة تعيين كلمة المرور.

تذكرت كلمة المرور؟ سجّل الدخول
+ + + + diff --git a/index.html b/index.html new file mode 100644 index 0000000..c59e627 --- /dev/null +++ b/index.html @@ -0,0 +1,80 @@ + + + + + + + + + نماذج تجربة العضوية — أنور بي آي + + + + + +
+
+
+

نماذج تجربة · مسار العضوية

+

كيف يرى المستخدم المحتوى قبل وبعد الاشتراك

+

ثلاث شاشات مترابطة: الزائر يرى معاينة مجانية وقفل الوصول للمتقدم، والمشترك يرى الدليل كاملاً بملفات العمل، ثم يدير حسابه من الإعدادات — بما فيها كلمة المرور وإلغاء الاشتراك.

+
+
+
٠١ · زائر غير مشترك

الدليل المقفل

الزائر المسجَّل فقط يقرأ المقدمة والقسم الأول، ثم تصلك نقطة القفل: ما المتبقي بالضبط، وسعر واحد واضح، وزر اشتراك واحد.

  • معاينة مجانية محدودة
  • قائمة الأقسام المقفلة بأيقونات
  • بطاقة اشتراك عند نقطة القفل
افتح النموذج
+
٠٢ · مشترك فعّال

الدليل المفتوح

نفس الدليل كما يراه المشترك: كل الأقسام مكشوفة، شريط تقدّم في المسار، وملفات العمل قابلة للتنزيل بضغطة واحدة.

  • وصول كامل بلا حواف قفل
  • تقدّمك في مسار الوكلاء
  • تنزيل قالب الحالة وقائمة الفحص
افتح النموذج
+
٠٣ · إدارة الحساب

الإعدادات والعضوية

أربع أقسام تعمل فعلاً: الملف الشخصي، تغيير كلمة المرور بتحقق فوري، تفضيلات الرسائل، وإلغاء الاشتراك مع تأكيد واضح.

  • تغيير كلمة المرور بشروط ظاهرة
  • تبديل التفضيلات وحفظها
  • إلغاء يؤجل التجديد ولا يقطع الوصول فوراً
افتح النموذج
+
+
+

جرّب المسار كاملاً

+
    +
  1. افتح الدليل المقفل كزائر — لاحظ أن الفهرس الجانبي يُظهر الأقسام المقفلة بدل إخفائها، فيعرف الزائر ماذا يفوّت بالضبط.
  2. +
  3. افتح الدليل المفتوح كعضو — نفس المادة بلا نقطة قفل، مع بطاقة تقدّم وملفات تنزيل تعمل.
  4. +
  5. من الإعدادات جرّب كلمة المرور ببيانات خاطئة ثم صحيحة، ثم الإلغاء: تأكيد واضح، حالة العضوية تتغير، وزر إعادة الاشتراك يظهر.
  6. +
+
+
+ + + diff --git a/login.html b/login.html new file mode 100644 index 0000000..a9fdbac --- /dev/null +++ b/login.html @@ -0,0 +1,36 @@ + + + + + + + + + تسجيل الدخول — أنور بي آي + + + + + +
+
+

مساحتك في أنور بي آي

أكمل من حيث توقفت.

احفظ أدلتك، تابع مسارات الفيديو، وارجع إلى ملاحظاتك من أي جهاز.

  • المقالات المحفوظةمرتبّة
  • تقدّم المساراتمتزامن
  • ملفات العضويةجاهزة

العربية أولاً · خصوصيتك محفوظة

+

أهلاً بعودتك

تسجيل الدخول

استخدم بريدك وكلمة المرور للوصول إلى حسابك.

أو

بالمتابعة، أنت توافق على شروط الاستخدام وسياسة الخصوصية.

+
+ + + + \ No newline at end of file diff --git a/post-locked.html b/post-locked.html new file mode 100644 index 0000000..5b6f453 --- /dev/null +++ b/post-locked.html @@ -0,0 +1,140 @@ + + + + + + + + + دليل مقفل — زيارة غير مشترك — أنور بي آي + + + + + +

نموذج تجريبي: زائر غير مشترك — الأقسام المتقدمة مغلقة. قارن مع: post-unlocked.html

+
+
+
+ VIP · معاينة مجانية +

الوكلاء · دليل عملي

+

امنع وكيلك من الدوران في حلقة

+

افصل التخطيط والتنفيذ والتحقق، وحدد متى يتوقف الوكيل ومتى يطلب تدخلاً بشرياً — مع قالب حالة وقائمة فحص جاهزة للتشغيل.

+ +
+
+
+

معاينة مجانية

+

الوكيل الذي يدور في حلقة لا ينقصه ذكاء؛ ينقصه شرط توقف. هنا نبني الحلقة بحيث يستطيع الوكيل أن يقول «انتهيت» — أو «أحتاجك».

+

أغلب الوكلاء يفشل بطريقة واحدة: يعيدون تخطيط المهمة نفسها إلى ما لا نهاية. السبب دائماً بنية الحلقة: التخطيط والتنفيذ والتحقق مدموجة في تعليمة واحدة، فلا يملك الوكيل مرجعاً مستقلاً يخبره أن النتيجة تحققت فعلاً.

+

١. اكتب نتيجة يمكن فحصها

+

ابدأ بما يجب أن يكون صحيحاً عند النهاية. «ابحث عن أفضل خيار» هدف ضبابي. أما «أنشئ قائمة من ثلاثة خيارات، مع المصدر والسعر وتاريخ التحقق» فيمكن اختباره بشرط واحد واضح.

+
قاعدة أنور بي آيإذا لم تستطع كتابة اختبار بسيط للنتيجة، فلن يعرف الوكيل متى يتوقف.
+
+

من هنا تبدأ الأجزاء العملية: بنية الحلقة خطوة بخطوة، قالب حالة الوكيل جاهز النسخ، وقائمة الفحص التي تمرّر عليها قبل كل تشغيل — وهي المحتوى الذي تفرّق بين وكيل يعمل مرة ووكيل يعتمد عليه فريقك.

+
+
+

الجزء المتبقي · للأعضاء فقط

+

أكملت الجزء المجاني من هذا الدليل

+

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

+
    +
  • ٢. استخدم حلقة قصيرة وواضحة٤ دقائق
  • +
  • ٣. اجعل الأدوات ضيقة الصلاحية٣ دقائق
  • +
  • قالب حالة الوكيل + قائمة الفحصملفات
  • +
  • فيديو تطبيقي: تشغيل الحلقة معاً١٢ دقيقة
  • +
+ +

٤٩ ر.س شهرياً · إلغاء فوري في أي وقت · الدفع غير مربوط في هذه المعاينة

+
+
+ +
+
+ + + + + diff --git a/post-unlocked.html b/post-unlocked.html new file mode 100644 index 0000000..1ccb7c6 --- /dev/null +++ b/post-unlocked.html @@ -0,0 +1,144 @@ + + + + + + + + + دليل مفتوح — زيارة مشترك — أنور بي آي + + + + + +

نموذج تجريبي: مشترك فعّال — الدليل كامل وملفات العمل قابلة للتنزيل. قارن مع: post-locked.html

+
+
+
+ VIP · وصول كامل +

الوكلاء · دليل عملي

+

امنع وكيلك من الدوران في حلقة

+

افصل التخطيط والتنفيذ والتحقق، وحدد متى يتوقف الوكيل ومتى يطلب تدخلاً بشرياً — مع قالب حالة وقائمة فحص جاهزة للتشغيل.

+ +
+
+
+

الوكيل الذي يدور في حلقة لا ينقصه ذكاء؛ ينقصه شرط توقف. هنا نبني الحلقة بحيث يستطيع الوكيل أن يقول «انتهيت» — أو «أحتاجك».

+

أغلب الوكلاء يفشل بطريقة واحدة: يعيدون تخطيط المهمة نفسها إلى ما لا نهاية. السبب دائماً بنية الحلقة: التخطيط والتنفيذ والتحقق مدموجة في تعليمة واحدة، فلا يملك الوكيل مرجعاً مستقلاً يخبره أن النتيجة تحققت فعلاً.

+

١. اكتب نتيجة يمكن فحصها

+

ابدأ بما يجب أن يكون صحيحاً عند النهاية. «ابحث عن أفضل خيار» هدف ضبابي. أما «أنشئ قائمة من ثلاثة خيارات، مع المصدر والسعر وتاريخ التحقق» فيمكن اختباره بشرط واحد واضح.

+
قاعدة أنور بي آيإذا لم تستطع كتابة اختبار بسيط للنتيجة، فلن يعرف الوكيل متى يتوقف.
+

٢. استخدم حلقة قصيرة وواضحة

+
  1. خطّط

    حوّل الهدف إلى خطوة واحدة تالية، لا إلى خطة ضخمة لا تتغير.

  2. نفّذ

    استدعِ أداة واحدة بمدخلات محددة وسجّل ما حدث فعلاً.

  3. تحقق

    قارن الناتج بشرط النجاح، ثم توقف أو عدّل الخطوة التالية.

+
while not done:
+    step = planner.next(goal, state)
+    result = tools.run(step)
+    state.record(result)
+    done = verifier.check(goal, state)
+

٣. اجعل الأدوات ضيقة الصلاحية

+

لا تمنح الوكيل أداة «نفّذ أي أمر». قدّم وظائف محددة مثل قراءة ملف، إنشاء مسودة، أو إرسال عنصر بعد موافقة. كلما ضاقت الأداة أصبح اختبارها ومراجعتها أسهل.

+
  • تحقق من المدخلات قبل التنفيذ.
  • اطلب موافقة بشرية قبل الإرسال أو الحذف أو الدفع.
  • احتفظ بسجل واضح للطلب والنتيجة.
+

٤. ملفات العمل

+

قالب الحالة يحفظ الهدف والخطوة الأخيرة وشرط النجاح في مكان واحد، وقائمة الفحص تُمرَّر قبل كل تشغيل. انسخهما إلى مشروعك وعدّل الحقول الثلاثة فقط: الهدف، الشرط، وصلاحيات الأدوات.

+
الخلاصةابدأ بحلقة صغيرة واختبار واحد. أضف الذاكرة والتخطيط المتقدم فقط عندما يثبت القياس أنك تحتاجهما.
+
+ +
+

نقاش الأعضاء · هادئ ومفيد

التعليقات

سارة ع.قبل يومين

طبّقت قائمة الفحص على وكيل الفواتير لدينا — المشكلة كانت فعلاً غياب شرط توقف واضح.

+ +
+ + + + + diff --git a/privacy.html b/privacy.html new file mode 100644 index 0000000..306d359 --- /dev/null +++ b/privacy.html @@ -0,0 +1,42 @@ + + + + + + + + + سياسة الخصوصية — أنور بي آي + + + + + +
+
+

الخصوصية · مسودة ما قبل الإطلاق

بياناتك ليست مادة للمحتوى.

توضح هذه المسودة الحد الأدنى المقترح لجمع البيانات واستخدامها داخل أنور بي آي.

هذه سياسة تجريبية للواجهة وليست نصاً قانونياً نهائياً. يجب مراجعتها واعتمادها قبل نشر الموقع.

+
+

ما الذي نجمعه؟

عند تشغيل الحسابات فعلياً قد نحتاج إلى الاسم والبريد الإلكتروني، وبيانات العضوية والفوترة التي يوفرها مزوّد الدفع. لا ينبغي تخزين بيانات البطاقة كاملة داخل المنصة.

+

كيف تُستخدم البيانات؟

  • تسجيل الدخول وحفظ التقدّم والتفضيلات.
  • إدارة العضوية وإرسال الرسائل التي اختارها المستخدم.
  • حماية المنصة وتشخيص الأعطال وتحسين تجربة القراءة.
+

المشاركة والاحتفاظ

لا تُباع البيانات الشخصية. قبل الإطلاق يجب تسمية مزوّدي الاستضافة والبريد والدفع والتحليلات، وتحديد مدة الاحتفاظ بكل نوع من البيانات بوضوح.

+

حقوقك

يمكنك طلب نسخة من بياناتك أو تصحيحها أو حذفها بعد تفعيل الحسابات. أرسل طلبك إلى hello@anwarpi.ai.

+

التحديثات

يجب إضافة تاريخ السريان وملخص أي تغيير جوهري عند اعتماد النسخة القانونية النهائية.

+
+
+ + + diff --git a/scripts/check_site.py b/scripts/check_site.py new file mode 100644 index 0000000..be28c1f --- /dev/null +++ b/scripts/check_site.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python3 +"""Fail when the static site contains broken or non-portable local references.""" + +from html.parser import HTMLParser +from pathlib import Path +from urllib.parse import unquote, urlsplit + +ROOT = Path(__file__).resolve().parents[1] +SKIP_PREFIXES = ("#", "data:", "mailto:", "tel:", "javascript:") + + +class PageParser(HTMLParser): + def __init__(self): + super().__init__() + self.references = [] + self.ids = set() + self.has_viewport = False + self.has_csp = False + + def handle_starttag(self, tag, attrs): + values = dict(attrs) + element_id = values.get("id") + if element_id: + self.ids.add(element_id) + if tag == "meta" and values.get("name", "").lower() == "viewport": + self.has_viewport = True + if tag == "meta" and values.get("http-equiv", "").lower() == "content-security-policy": + self.has_csp = True + for attribute in ("href", "src", "action"): + value = values.get(attribute) + if value: + self.references.append((tag, attribute, value)) + + +def parse_page(path): + parser = PageParser() + parser.feed(path.read_text(encoding="utf-8")) + return parser + + +def main(): + pages = sorted(ROOT.glob("*.html")) + parsed = {page.resolve(): parse_page(page) for page in pages} + errors = [] + + if not (ROOT / "index.html").is_file(): + errors.append("missing GitHub Pages entry point: index.html") + + for page in pages: + parser = parsed[page.resolve()] + if not parser.has_viewport: + errors.append(f"{page.name}: missing viewport metadata") + if not parser.has_csp: + errors.append(f"{page.name}: missing Content Security Policy") + + for tag, attribute, raw_value in parser.references: + value = raw_value.strip() + if not value or value.startswith(SKIP_PREFIXES): + continue + + url = urlsplit(value) + if url.scheme or url.netloc: + errors.append(f"{page.name}: remote dependency in {attribute}: {value}") + continue + if url.path.startswith("/"): + errors.append(f"{page.name}: root-absolute path breaks project Pages: {value}") + continue + + target = (page.parent / unquote(url.path or page.name)).resolve() + try: + target.relative_to(ROOT) + except ValueError: + errors.append(f"{page.name}: reference leaves repository: {value}") + continue + if not target.exists(): + errors.append(f"{page.name}: missing {tag} {attribute} target: {value}") + continue + + if url.fragment and target.suffix.lower() == ".html": + target_parser = parsed.get(target) + if target_parser is None: + target_parser = parse_page(target) + parsed[target] = target_parser + if unquote(url.fragment) not in target_parser.ids: + errors.append(f"{page.name}: missing anchor target: {value}") + + if errors: + print("Site validation failed:") + for error in errors: + print(f"- {error}") + raise SystemExit(1) + + print(f"Site validation passed: {len(pages)} HTML pages checked.") + + +if __name__ == "__main__": + main() diff --git a/security-audit.md b/security-audit.md new file mode 100644 index 0000000..b4c3526 --- /dev/null +++ b/security-audit.md @@ -0,0 +1,48 @@ +# تدقيق الأمان النهائي قبل الإطلاق + +## القرار + +**صالح للنشر العام كنموذج واجهة ثابتة فقط. غير صالح بعد كنظام حسابات أو عضوية إنتاجي.** + +الصفحات الحالية لا تتصل بخادم، ولا تنفّذ تسجيل دخول أو تغيير كلمة مرور أو دفع أو إلغاء اشتراك فعلي. رسائل النجاح في هذه الشاشات هي محاكاة داخل المتصفح، وهذا واضح في نصوص المعاينة الحالية. + +## ما تم فحصه + +- 11 صفحة HTML وملفا CSS/JavaScript مشتركان. +- الأسرار والمفاتيح وبيانات الاعتماد المضمّنة. +- مسارات XSS الشائعة: `innerHTML` و`eval` و`document.write` وروابط `javascript:`. +- الروابط والأصول المحلية ومحاولات الخروج من مجلد المشروع. +- عناوين URL والاعتماديات البعيدة. +- صحة JavaScript المضمّن والمشترك. +- نماذج تسجيل الدخول، استعادة كلمة المرور، إعدادات الحساب، والتعليقات. + +## الإصلاحات المنفذة + +أضيف إلى الصفحات الـ11: + +1. سياسة إحالة `strict-origin-when-cross-origin`. +2. سياسة محتوى CSP تمنع الاتصالات الخارجية والإطارات والكائنات والإضافات، وتقصر الصور والخطوط والملفات على أصل الموقع. +3. تقييد وجهة النماذج إلى أصل الموقع فقط. + +## نتائج التحقق + +- لا أسرار أو مفاتيح API مكتشفة. +- لا روابط أو صور أو سكربتات بعيدة. +- لا استخدام لمسارات JavaScript الخطرة التي جرى فحصها. +- جميع الروابط والأصول المحلية موجودة ولا تخرج من المشروع. +- 11 سكربتاً مضمّناً وملف JavaScript مشترك اجتازوا فحص الصياغة. +- جميع الصفحات الـ11 تحتوي CSP وسياسة إحالة، مرة واحدة لكل صفحة. + +## المتبقي قبل إطلاق حسابات حقيقية + +1. بناء مصادقة وجلسات على الخادم باستخدام Cookies آمنة (`Secure` و`HttpOnly` و`SameSite`) وعدم تخزين رموز الدخول في `localStorage`. +2. تنفيذ التفويض على الخادم لكل محتوى حصري؛ إخفاء المحتوى في الواجهة وحده لا يحميه. +3. إضافة CSRF وتحديد المعدل لتسجيل الدخول واستعادة كلمة المرور، مع رسائل لا تكشف وجود الحساب. +4. نقل JavaScript وCSS المضمّنين إلى ملفات محلية ثم إزالة `'unsafe-inline'` من CSP، وإرسال CSP وبقية ترويسات الأمان كـ HTTP headers من منصة الاستضافة. +5. اعتماد سياسة الخصوصية قانونياً وربط الدفع والبريد عبر مزودين موثوقين قبل جمع أي بيانات حقيقية. + +## إعدادات المستودع المقترحة + +- إبقاء المستودع خاصاً حتى إزالة أي محتوى تجريبي غير مخصص للعامة. +- تفعيل GitHub secret scanning وpush protection و2FA للحسابات التي تملك صلاحية النشر. +- حماية فرع الإنتاج وطلب مراجعة قبل الدمج. diff --git a/subscription.html b/subscription.html new file mode 100644 index 0000000..d00f1c3 --- /dev/null +++ b/subscription.html @@ -0,0 +1,52 @@ + + + + + + + + + عضوية أنور بي آي — الأسعار والمزايا + + + + + +
+
+

عضوية أنور بي آي · للجادّين في البناء

تعلّم أقل. طبّق أكثر.

أدلة معمّقة، مسارات فيديو، وملفات عمل تختصر الطريق من الفكرة إلى مشروع يمكنك اختباره.

لا دورات متراكمة.

كل مادة تنتهي بخطوة عملية، وقرار واضح، وملف يمكنك استخدامه في مشروعك.

+

محتوى حصري بمستوى متقدم

تعلّم مهارات ترفع قيمتك في السوق.

أدلة عالية المستوى لا تكتفي بشرح الأدوات؛ تساعدك على بناء خبرة عملية تظهر في عملك، مسارك المهني، أو مشروعك التجاري.

01

أدلة حصرية عميقة

تفكيك عملي للأنظمة الوكيلة، الاسترجاع، الأتمتة، وتشغيل النماذج حتى تفهم كيف تُبنى الحلول فعلاً.

02

مهارات تصنع فرقاً

مسارات مركّزة تنقلك من مستخدم للأداة إلى شخص قادر على تصميم حلول ذكاء اصطناعي ذات قيمة.

03

تنفيذ يصلح للعمل

قوالب وملفات عملية تساعدك على تحويل المعرفة إلى مشروع، إنجاز مهني، أو فرصة نمو في أعمالك.

+

نماذج من مكتبة الأعضاء

أدلة حقيقية تبدأ من المشكلة وتنتهي بملف عملي.

هذه مواد موجودة في كتالوج أنور بي آي؛ كل نموذج يوضح ما ستتعلمه وما ستخرج به قبل الاشتراك.

+
دليل عملي · حصريتشريح وكيل ناجح
الوكلاء١٨ دقيقة

امنع وكيلك من الدوران في حلقة

افصل التخطيط والتنفيذ والتحقق، وحدد متى يتوقف الوكيل ومتى يطلب تدخلاً بشرياً.

الملف المرفققالب حالة الوكيل + قائمة فحص قبل التشغيل
اقرأ نموذجاً كاملاً
+
فيديو تطبيقي · حصريراقب قبل أن تؤتمت
الأتمتة٢٤ دقيقة

اكتشف فشل سير العمل قبل المستخدم

راقب التكلفة، زمن الاستجابة، ونقاط الانقطاع بإشارات قليلة يمكن لفريقك فهمها والتصرف بناءً عليها.

الملف المرفققائمة مراقبة لسير العمل + نموذج سجل الأخطاء
شاهد تفاصيل الدليل
+
سلسلة فيديو · حصريقياس RAG بصدق
النماذج٤ أجزاء

افصل فشل الاسترجاع عن فشل الإجابة

ابنِ مجموعة اختبار صغيرة، راجع جودة المصادر، ثم قِس الإجابة من دون خلط المشكلتين.

الملف المرفقورقة تقييم للاسترجاع والإجابة خطوة بخطوة
استكشف السلسلة
+
+

من المعرفة إلى التأثير

كن الشخص الذي يعرف كيف يحوّل الذكاء الاصطناعي إلى نتيجة.

ابنِ مهارات مطلوبة، قرارات أفضل، ومشاريع يمكن عرضها أو تشغيلها—سواء كنت تطوّر مسارك أو تنمّي أعمالك.

01

لمسارك المهني

تعلّم كيف تصمم الوكلاء والأتمتة وتشرح قراراتك التقنية، ثم حوّل ذلك إلى أعمال قوية ترفع مستوى ملفك المهني.

02

لنمو أعمالك

اكتشف أين يضيف الذكاء الاصطناعي قيمة حقيقية، وكيف تختبر الفكرة بسرعة قبل أن تهدر الوقت أو الميزانية.

اسأل فريق أنور عنبتاوي مباشرة

لديك سؤال عن دليل، تطبيق، مسار مهني، أو فكرة عمل؟ أرسل ما تحتاجه وسيرد عليك الفريق مباشرة.

تواصل مع الفريق
+

سعر واحد · وصول كامل

ابدأ بعضوية أنور بي آي.

ألغِ في أي وقت. يبقى حسابك المجاني ومقالاتك المحفوظة بعد الإلغاء.

عضوية فردية

سعر تجريبي للمعاينة
٤٩ ر.سشهرياً
  • كل الأدلة الحصريةمتاح
  • مسارات الفيديومتاح
  • ملفات العمل والتنزيلاتمتاح
  • تحديثات المحتوىمستمرة

القيمة المعروضة مؤقتة للمعاينة وتحتاج اعتماداً قبل الإطلاق.

+

قارن الوصول

المجاني يعرّفك. العضوية تساعدك على البناء.

المحتوىحساب مجانيعضوية أنور بي آي
المقالات التمهيديةكاملةكاملة
الأدلة المتقدمةمعاينةكاملة
مسارات الفيديوالمقدمةكل الأجزاء
ملفات العمل—قابلة للتنزيل
حفظ التقدّممتاحمتاح
+

قبل أن تبدأ

أسئلة شائعة

إجابات مباشرة عن الوصول، الإلغاء، وطريقة تقديم المحتوى.

نعم. يتوقف التجديد التالي، ويستمر وصولك حتى نهاية الفترة المدفوعة.
توضح كل مادة مستواها ومتطلباتها. ابدأ بمسار الأساسيات ثم انتقل إلى الوكلاء والأتمتة.
لا حالياً. تركيز أنور بي آي على التطبيق والملفات العملية، لا على شهادات الحضور.
نعم للاستخدام الشخصي والمهني داخل مشاريعك. إعادة بيع الملفات أو نشرها كما هي غير مشمول.
+
+ + + + + + \ No newline at end of file diff --git a/vip-onboarding.html b/vip-onboarding.html new file mode 100644 index 0000000..e4d01bb --- /dev/null +++ b/vip-onboarding.html @@ -0,0 +1,289 @@ + + + + + + + + + ابدأ عضويتك — أنور بي آي + + + + + +

تم تفعيل وصول VIP — لنستثمر أول خمس دقائق في إعداد مسارك.

+
+ +
+ +
+
+
+

عضو VIP جديد · إعداد سريع

+

مرحباً بك. لنبدأ بما يخدم هدفك.

+

أجب عن سؤالين وحدد رسائلك المفضلة. سنقترح نقطة بداية واضحة بدلاً من تركك أمام مكتبة كبيرة.

+
+
الخطوة ١ من ٤٢٥٪
+
+
+
+
+ +
+ + +
+
+

ما النتيجة التي تريدها أولاً؟

+

اختر هدفاً واحداً الآن. يمكنك تغييره لاحقاً من إعدادات الحساب.

+
+ + + + +
+

+
+
+ +
+

ما مستوى خبرتك العملي؟

+

لا نختبرك. الإجابة تضبط ترتيب المواد وكمية الشرح في اقتراح البداية.

+
+ + + +
+

+
+
+ +
+

اختر ما يستحق الوصول إلى بريدك.

+

كل الخيارات قابلة للتغيير. لا يؤثر إيقافها على وصولك إلى محتوى VIP.

+
+
خلاصة الأحد

أفضل ما نُشر هذا الأسبوع مع نقطة تطبيق واحدة.

+
تحديثات المسار

رسالة عندما نضيف جزءاً جديداً إلى المسار الذي تتبعه.

+
الردود على تعليقاتك

تنبيه فقط عندما يرد عضو أو فريق أنور على سؤالك.

+
+
+
+ +
+

مسارك جاهز.

+

ابدأ بمادة واحدة، طبّق ملفها العملي، ثم عد إلى المكتبة. لا حاجة لفتح كل شيء اليوم.

+
+
هدفك
—
+
مستواك
—
+
الرسائل
—
+
+
+

نقطة البداية المقترحة

+

تشريح وكيل ناجح

+

ابدأ بفصل التخطيط عن التنفيذ والتحقق، ثم استخدم قالب حالة الوكيل في مشروع صغير.

+ ابدأ الدليل الأول +
+
اذهب إلى المكتبة
+
+
+
+
+ + + + + + + +