| <!DOCTYPE html> |
| <html lang="ar" dir="rtl"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>OpenCode: دليل الوكيل البرمجي المفتوح</title> |
| |
| |
| <link rel="preconnect" href="https://fonts.googleapis.com"> |
| <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> |
| <link href="https://fonts.googleapis.com/css2?family=Cairo:wght@400;700&family=Tajawal:wght@400;500;700&display=swap" rel="stylesheet"> |
| |
| |
| <script src="https://cdn.tailwindcss.com"></script> |
| |
| |
| <meta name="theme-color" content="#0ea5e9"> |
| <meta name="description" content="تطبيق تعليمي تفاعلي لاستكشاف أداة OpenCode البديلة لـ Claude Code"> |
| <link rel="apple-touch-icon" href="https://cdn-icons-png.flaticon.com/512/2103/2103633.png"> |
| |
| |
| <script> |
| tailwind.config = { |
| darkMode: 'class', |
| theme: { |
| extend: { |
| fontFamily: { |
| cairo: ['Cairo', 'sans-serif'], |
| tajawal: ['Tajawal', 'sans-serif'], |
| }, |
| colors: { |
| primary: '#0ea5e9', |
| darkBg: '#0f172a', |
| darkCard: '#1e293b', |
| } |
| } |
| } |
| } |
| </script> |
|
|
| <style> |
| body { |
| font-family: 'Tajawal', sans-serif; |
| scroll-behavior: smooth; |
| transition: background-color 0.3s, color 0.3s; |
| } |
| h1, h2, h3, h4 { |
| font-family: 'Cairo', sans-serif; |
| } |
| .text-justify { |
| text-align: justify; |
| } |
| .prompt-box { |
| overflow-wrap: break-word; |
| word-wrap: break-word; |
| white-space: pre-wrap; |
| } |
| |
| ::-webkit-scrollbar { |
| width: 8px; |
| } |
| ::-webkit-scrollbar-track { |
| background: #f1f1f1; |
| } |
| .dark ::-webkit-scrollbar-track { |
| background: #0f172a; |
| } |
| ::-webkit-scrollbar-thumb { |
| background: #0ea5e9; |
| border-radius: 4px; |
| } |
| |
| #backToTop { |
| transition: opacity 0.3s, visibility 0.3s; |
| } |
| </style> |
| </head> |
| <body class="bg-stone-50 text-stone-900 dark:bg-slate-900 dark:text-slate-100"> |
|
|
| |
| <button id="themeToggle" class="fixed top-4 left-4 z-50 p-3 rounded-full bg-white dark:bg-slate-800 shadow-lg border border-stone-200 dark:border-slate-700 hover:scale-110 transition-transform focus:outline-none"> |
| <span id="themeIcon" class="text-xl">🌙</span> |
| </button> |
|
|
| |
| <nav class="sticky top-0 z-40 w-full bg-white/80 dark:bg-slate-900/80 backdrop-blur-md border-b border-stone-200 dark:border-slate-800"> |
| <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> |
| <div class="flex justify-between items-center h-16"> |
| <div class="flex items-center"> |
| <span class="text-xl font-bold text-primary font-cairo">دليل OpenCode</span> |
| </div> |
| <div class="hidden md:flex space-x-6 space-x-reverse mr-10"> |
| <a href="#intro" class="hover:text-primary transition-colors font-medium">البداية</a> |
| <a href="#features" class="hover:text-primary transition-colors font-medium">المميزات</a> |
| <a href="#comparison" class="hover:text-primary transition-colors font-medium">المقارنة</a> |
| <a href="#modes" class="hover:text-primary transition-colors font-medium">أوضاع العمل</a> |
| <a href="#cli" class="hover:text-primary transition-colors font-medium">الأوامر</a> |
| <a href="#prompts" class="hover:text-primary transition-colors font-medium">المطالبات</a> |
| </div> |
| </div> |
| </div> |
| </nav> |
|
|
| |
| <main class="max-w-7xl mx-auto px-4 py-8"> |
| |
| |
| <section id="intro" class="mb-16"> |
| <div class="text-center mb-12"> |
| <h1 class="text-3xl md:text-4xl font-bold mb-4"> |
| مراجعة شاملة لأداة OpenCode </h1> |
| <h2 class="text-2xl md:text-2xl text-gray-400 font-bold mb-4"> |
| المنافس المفتوح المصدر لـ Claude Code</h2> |
| |
| <p class="text-lg text-stone-600 dark:text-slate-400 max-w-3xl mx-auto text-justify"> |
| يقدم هذا التطبيق التعليمي ملخصاً معززاً وتفصيلياً يستعرض أداة <b>OpenCode</b>، وهي وكيل برمجي (Coding Agent) مفتوح المصدر وسريع النمو. تهدف هذه الأداة إلى توفير بيئة برمجية متكاملة تعتمد على الذكاء الاصطناعي مع مرونة كاملة في اختيار النماذج والخصوصية، مما يجعلها الخيار الأول للمطورين الذين ينشدون الاستقلالية. |
| </p> |
| </div> |
|
|
| <div class="bg-white dark:bg-slate-800 rounded-2xl p-8 shadow-sm border border-stone-200 dark:border-slate-700"> |
| <h2 class="text-2xl font-bold mb-6 border-r-4 border-primary pr-4">ما هي أداة OpenCode؟</h2> |
| <p class="text-justify mb-4"> |
| تُعد <b>OpenCode</b> أداة برمجية متطورة تعمل عبر واجهة السطر البرمجي (CLI) وتطبيق سطح المكتب. تم تصميمها لتنفيذ مهام برمجية معقدة ومتعددة الخطوات. ما يميز هذه الأداة هو جذورها التقنية؛ فقد تم تطويرها بواسطة فريق يمتلك خبرة واسعة في أدوات مثل <b>Neovim</b> (تحديداً المطورين خلف مشروع <i>avante.nvim</i>)، مما جعل واجهتها سلسة، سريعة، واحترافية للغاية تلائم سير عمل المحترفين. |
| </p> |
| <p class="text-justify"> |
| على عكس الأدوات المغلقة، تمنحك OpenCode القدرة على "جلب مفتاحك الخاص" (BYOK)، مما يعني أنك لا ترتبط بمزود واحد أو اشتراك محدد، بل يمكنك التنقل بين أفضل النماذج المتاحة في السوق لحظة بلحظة. |
| </p> |
| </div> |
| </section> |
|
|
| |
| <section id="features" class="mb-16"> |
| <h2 class="text-2xl font-bold mb-8 text-center">المميزات الاستثنائية للأداة</h2> |
| <div class="grid grid-cols-1 md:grid-cols-2 gap-6"> |
| |
| <div class="group bg-white dark:bg-slate-800 p-6 rounded-xl border border-stone-200 dark:border-slate-700 hover:shadow-xl hover:-translate-y-1 transition-all duration-300"> |
| <div class="flex items-center mb-4"> |
| <div class="p-3 bg-blue-100 dark:bg-blue-900 rounded-lg ml-4"> |
| <span class="text-2xl">🔓</span> |
| </div> |
| <h3 class="text-xl font-bold">مفتوحة المصدر بالكامل</h3> |
| </div> |
| <p class="text-justify text-stone-600 dark:text-slate-400"> |
| الأداة مرخصة تحت رخصة <b>MIT</b>، مما يعني شفافية كاملة في كيفية التعامل مع الكود الخاص بك، وأماناً أعلى لبياناتك الحساسة. يمكنك تدقيق الكود البرمجي للأداة نفسها للتأكد من عدم وجود ثغرات أو تسريب للبيانات. |
| </p> |
| </div> |
| |
| <div class="group bg-white dark:bg-slate-800 p-6 rounded-xl border border-stone-200 dark:border-slate-700 hover:shadow-xl hover:-translate-y-1 transition-all duration-300"> |
| <div class="flex items-center mb-4"> |
| <div class="p-3 bg-green-100 dark:bg-green-900 rounded-lg ml-4"> |
| <span class="text-2xl">🧠</span> |
| </div> |
| <h3 class="text-xl font-bold">دعم هائل للنماذج (70+)</h3> |
| </div> |
| <p class="text-justify text-stone-600 dark:text-slate-400"> |
| لا تكتفِ بنموذج واحد؛ تدعم الأداة أكثر من 70 نموذج ذكاء اصطناعي تشمل: <b>Claude 3.5</b>، <b>GPT-4o</b>، <b>Gemini 1.5</b>، <b>DeepSeek</b>، وحتى نماذج <b>Grok</b>. هذا التنوع يضمن لك اختيار النموذج الأنسب للمهمة (مثلاً Gemini للمهام التي تتطلب سياقاً كبيراً، و Claude للبرمجة المنطقية الدقيقة). |
| </p> |
| </div> |
| |
| <div class="group bg-white dark:bg-slate-800 p-6 rounded-xl border border-stone-200 dark:border-slate-700 hover:shadow-xl hover:-translate-y-1 transition-all duration-300"> |
| <div class="flex items-center mb-4"> |
| <div class="p-3 bg-yellow-100 dark:bg-yellow-900 rounded-lg ml-4"> |
| <span class="text-2xl">🔌</span> |
| </div> |
| <h3 class="text-xl font-bold">تعدد المزودين (BYOK)</h3> |
| </div> |
| <p class="text-justify text-stone-600 dark:text-slate-400"> |
| يمكنك استخدام مفاتيح API الخاصة بك من <b>OpenRouter</b> أو <b>OpenAI</b> أو <b>Anthropic</b>، أو حتى الاستفادة من اشتراكاتك الحالية في <b>ChatGPT Plus</b> أو <b>GitHub Copilot</b> عبر بروتوكولات الربط المدعومة. |
| </p> |
| </div> |
| |
| <div class="group bg-white dark:bg-slate-800 p-6 rounded-xl border border-stone-200 dark:border-slate-700 hover:shadow-xl hover:-translate-y-1 transition-all duration-300"> |
| <div class="flex items-center mb-4"> |
| <div class="p-3 bg-purple-100 dark:bg-purple-900 rounded-lg ml-4"> |
| <span class="text-2xl">📝</span> |
| </div> |
| <h3 class="text-xl font-bold">دعم ملف agents.md</h3> |
| </div> |
| <p class="text-justify text-stone-600 dark:text-slate-400"> |
| تتبع الأداة الاتفاقية الموحدة لسياق الوكلاء الذكية. بمجرد وجود ملف <b>agents.md</b> في مشروعك، سيفهم الوكيل بنية المشروع، الأهداف، والقيود التقنية بسرعة فائقة، مما يقلل من "الهلوسة" البرمجية. |
| </p> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section id="comparison" class="mb-16"> |
| <h2 class="text-2xl font-bold mb-8 text-center">OpenCode مقابل Claude Code: أيهما تختار؟</h2> |
| <div class="grid grid-cols-1 md:grid-cols-2 gap-8"> |
| |
| <div class="relative p-8 rounded-2xl bg-gradient-to-br from-blue-50 to-white dark:from-slate-800 dark:to-slate-900 border-2 border-primary shadow-lg"> |
| <h3 class="text-2xl font-bold text-primary mb-6">OpenCode (الخيار الحر)</h3> |
| <ul class="space-y-4"> |
| <li class="flex items-center"> |
| <span class="ml-2 text-green-500 font-bold">✓</span> |
| <span><b>المصدر:</b> مفتوح المصدر بالكامل (MIT).</span> |
| </li> |
| <li class="flex items-center"> |
| <span class="ml-2 text-green-500 font-bold">✓</span> |
| <span><b>التكلفة:</b> دفع مقابل الاستخدام الفعلي (رخيص جداً).</span> |
| </li> |
| <li class="flex items-center"> |
| <span class="ml-2 text-green-500 font-bold">✓</span> |
| <span><b>النماذج:</b> أي نموذج يدعم واجهة API.</span> |
| </li> |
| <li class="flex items-center"> |
| <span class="ml-2 text-green-500 font-bold">✓</span> |
| <span><b>الخصوصية:</b> تحكم محلي كامل في البيانات.</span> |
| </li> |
| </ul> |
| </div> |
| |
| <div class="relative p-8 rounded-2xl bg-white dark:bg-slate-800 border-2 border-stone-300 dark:border-slate-600"> |
| <h3 class="text-2xl font-bold text-stone-500 mb-6">Claude Code (الخيار المغلق)</h3> |
| <ul class="space-y-4"> |
| <li class="flex items-center"> |
| <span class="ml-2 text-red-500 font-bold">✗</span> |
| <span><b>المصدر:</b> مغلق المصدر وملكية خاصة.</span> |
| </li> |
| <li class="flex items-center"> |
| <span class="ml-2 text-red-500 font-bold">✗</span> |
| <span><b>التكلفة:</b> اشتراكات مرتفعة (100-200 دولار شهرياً).</span> |
| </li> |
| <li class="flex items-center"> |
| <span class="ml-2 text-red-500 font-bold">✗</span> |
| <span><b>النماذج:</b> نماذج شركة Anthropic فقط.</span> |
| </li> |
| <li class="flex items-center"> |
| <span class="ml-2 text-red-500 font-bold">✗</span> |
| <span><b>الخصوصية:</b> تعتمد كلياً على سياسات الشركة.</span> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section id="modes" class="mb-16 bg-primary/5 dark:bg-primary/10 p-8 rounded-3xl"> |
| <h2 class="text-2xl font-bold mb-8 text-center">آلية العمل: النظام الثنائي المتكامل</h2> |
| <div class="grid grid-cols-1 lg:grid-cols-2 gap-12"> |
| <div class="bg-white dark:bg-slate-800 p-6 rounded-2xl shadow-sm"> |
| <h3 class="text-xl font-bold text-blue-600 mb-4 flex items-center"> |
| <span class="ml-2">1. وضع التخطيط (Plan Mode)</span> |
| </h3> |
| <p class="text-justify mb-4"> |
| هذا الوضع مخصص للاستكشاف والتحليل. يعمل الوكيل هنا بوضعية <b>القراءة فقط</b>. |
| </p> |
| <ul class="list-disc list-inside space-y-2 text-stone-600 dark:text-slate-400"> |
| <li>تحليل الكود الحالي وفهم الترابطات.</li> |
| <li>اقتراح حلول للمشاكل دون لمس الملفات.</li> |
| <li>آمن جداً لاستخدامه في المشاريع الكبيرة قبل اتخاذ قرار التعديل.</li> |
| </ul> |
| </div> |
| <div class="bg-white dark:bg-slate-800 p-6 rounded-2xl shadow-sm border-t-4 border-primary"> |
| <h3 class="text-xl font-bold text-primary mb-4 flex items-center"> |
| <span class="ml-2">2. وضع البناء (Build Mode)</span> |
| </h3> |
| <p class="text-justify mb-4"> |
| هنا تبدأ القوة الحقيقية؛ حيث يتحول الوكيل إلى مطور نشط يمتلك <b>صلاحيات الكتابة</b>. |
| </p> |
| <ul class="list-disc list-inside space-y-2 text-stone-600 dark:text-slate-400"> |
| <li>إنشاء ملفات جديدة تماماً.</li> |
| <li>تعديل الأسطر البرمجية بدقة عالية.</li> |
| <li>تنفيذ الأوامر في الطرفية (Terminal) لتثبيت الحزم أو تشغيل الاختبارات.</li> |
| </ul> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section id="cli" class="mb-16"> |
| <h2 class="text-2xl font-bold mb-8">التثبيت والإعداد السريع</h2> |
| <div class="bg-stone-900 text-slate-300 p-6 rounded-xl font-mono text-sm leading-relaxed shadow-2xl overflow-hidden"> |
| <div class="flex items-center mb-4 border-b border-stone-800 pb-2"> |
| <div class="flex space-x-2 space-x-reverse ml-4"> |
| <div class="w-3 h-3 bg-red-500 rounded-full"></div> |
| <div class="w-3 h-3 bg-yellow-500 rounded-full"></div> |
| <div class="w-3 h-3 bg-green-500 rounded-full"></div> |
| </div> |
| <span class="text-xs text-stone-500">Terminal - Installation</span> |
| </div> |
| <div class="space-y-4" dir="ltr"> |
| <div> |
| <span class="text-stone-500"># Install the tool globally using curl</span><br> |
| <span class="text-primary">curl</span> -sL https://opencode.ai/install.sh | <span class="text-primary">sh</span> |
| </div> |
| <div> |
| <span class="text-stone-500"># Login and choose your provider (OpenRouter/OpenAI)</span><br> |
| <span class="text-primary">opencode</span> login |
| </div> |
| <div> |
| <span class="text-stone-500"># Start building in your current directory</span><br> |
| <span class="text-primary">opencode</span> . |
| </div> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section id="prompts" class="mb-16"> |
| <h2 class="text-2xl font-bold mb-8 text-center">أمثلة عملية لمطالبات احترافية</h2> |
| <p class="text-center mb-10 text-stone-600 dark:text-slate-400">إليك كيف يمكنك صياغة طلباتك لتحصل على أفضل النتائج البرمجية.</p> |
| |
| |
| <div class="mb-12"> |
| <h3 class="text-xl font-bold mb-6 text-primary">المثال الأول: بناء لعبة ثلاثية الأبعاد</h3> |
| <div class="grid grid-cols-1 md:grid-cols-2 gap-0 rounded-2xl overflow-hidden shadow-lg"> |
| |
| <div class="bg-slate-800 p-6 text-white text-right" dir="rtl"> |
| <span class="inline-block bg-primary text-xs px-2 py-1 rounded mb-4 font-bold">المطالبة:</span> |
| <div class="font-tajawal leading-relaxed"> |
| قم بإنشاء <b>لعبة ركض لا نهائي ثلاثية الأبعاد</b> باستخدام لغة <b>TypeScript</b> ومكتبة <b>Three.js</b>. |
| يجب أن تتضمن اللعبة: |
| عناصر تحكم للاعب، عقبات تظهر عشوائياً، وطريق نيون يتم إنتاجه إجرائياً بشكل مستمر. |
| </div> |
| </div> |
| |
| <div class="bg-slate-900 p-6 text-slate-300 text-left font-mono text-sm" dir="ltr"> |
| <span class="inline-block bg-slate-700 text-xs px-2 py-1 rounded mb-4 font-bold uppercase">Prompt:</span> |
| <div class="prompt-box"> |
| Create a 3D endless runner game using Vanilla TypeScript and Three.js. |
| Include player controls, obstacles, and a procedurally generated neon road. |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div class="mb-12"> |
| <h3 class="text-xl font-bold mb-6 text-primary">المثال الثاني: لوحة تحكم CRM</h3> |
| <div class="grid grid-cols-1 md:grid-cols-2 gap-0 rounded-2xl overflow-hidden shadow-lg"> |
| |
| <div class="bg-slate-800 p-6 text-white text-right" dir="rtl"> |
| <span class="inline-block bg-primary text-xs px-2 py-1 rounded mb-4 font-bold">المطالبة:</span> |
| <div class="font-tajawal leading-relaxed"> |
| قم ببناء <b>لوحة تحكم لنظام إدارة علاقات العملاء (CRM)</b> مخصصة لحملات البريد الإلكتروني. |
| استخدم تقنيات <b>React</b> و <b>Vite</b> و <b>Tailwind CSS</b>. |
| يجب أن تشمل اللوحة: إدارة جهات الاتصال، تتبع حالة الحملات، ورسوماً بيانية للتحليلات. |
| </div> |
| </div> |
| |
| <div class="bg-slate-900 p-6 text-slate-300 text-left font-mono text-sm" dir="ltr"> |
| <span class="inline-block bg-slate-700 text-xs px-2 py-1 rounded mb-4 font-bold uppercase">Prompt:</span> |
| <div class="prompt-box"> |
| Build a CRM dashboard for email campaigns using React, Vite, and Tailwind. |
| Include contact management, campaign tracking, and analytics. |
| </div> |
| </div> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section class="mb-16"> |
| <div class="bg-white dark:bg-slate-800 rounded-3xl p-10 shadow-sm border border-stone-200 dark:border-slate-700"> |
| <h2 class="text-2xl font-bold mb-6">الخلاصة ونصائح الاستخدام المحترف</h2> |
| <div class="space-y-6"> |
| <p class="text-justify"> |
| أثبتت <b>OpenCode</b> أنها بديل حقيقي وقوي للأدوات المغلقة. إنها ليست مجرد أداة لإكمال الكود، بل هي شريك برمجي يفهم مشروعك ككل. إليك بعض النصائح النهائية: |
| </p> |
| <ul class="space-y-4"> |
| <li class="flex items-start"> |
| <span class="ml-3 mt-1 text-primary">✦</span> |
| <span>استخدم أمر <b>/init</b> عند بدء العمل على مشروع موجود؛ سيؤدي ذلك لإنشاء ملف <b>agents.md</b> الذي يُعد "البوصلة" للوكيل الذكي.</span> |
| </li> |
| <li class="flex items-start"> |
| <span class="ml-3 mt-1 text-primary">✦</span> |
| <span><b>التنويع في النماذج:</b> لا تلتزم بنموذج واحد. استخدم <b>Claude 3.5 Opus</b> للمنطق المعقد، و <b>Gemini 1.5 Pro</b> للواجهات الأمامية، و <b>GPT-4o Codex</b> لإصلاح الأخطاء.</span> |
| </li> |
| <li class="flex items-start"> |
| <span class="ml-3 mt-1 text-primary">✦</span> |
| <span><b>البحث العميق (Deep Research):</b> إذا واجهت مشكلة تقنية نادرة، اطلب من الوكيل تفعيل ميزة البحث العميق لتزويده بأحدث الحلول من التوثيقات الرسمية مباشرة.</span> |
| </li> |
| </ul> |
| <div class="pt-6 border-t border-stone-100 dark:border-slate-700 text-center"> |
| <p class="font-bold text-primary text-xl">حقوق المحتوى متاحة للجميع</p> |
| </div> |
| </div> |
| </div> |
| </section> |
|
|
| </main> |
|
|
| |
| <button id="backToTop" class="fixed bottom-8 left-8 p-4 bg-primary text-white rounded-full shadow-2xl opacity-75 hover:opacity-100 invisible transition-all duration-300 z-50"> |
| <span class="text-xl">↑</span> |
| </button> |
|
|
| |
| <footer class="bg-stone-100 dark:bg-slate-950 py-12 border-t border-stone-200 dark:border-slate-800"> |
| <div class="max-w-7xl mx-auto px-4 text-center"> |
| <p class="text-stone-500 dark:text-slate-400">طُور هذا التطبيق التعليمي لتعزيز المهارات البرمجية باستخدام OpenCode</p> |
| </div> |
| </footer> |
|
|
| |
| <script> |
| |
| const themeToggle = document.getElementById('themeToggle'); |
| const themeIcon = document.getElementById('themeIcon'); |
| const html = document.documentElement; |
| |
| themeToggle.addEventListener('click', () => { |
| html.classList.toggle('dark'); |
| const isDark = html.classList.contains('dark'); |
| themeIcon.innerText = isDark ? '☀️' : '🌙'; |
| localStorage.setItem('theme', isDark ? 'dark' : 'light'); |
| }); |
| |
| |
| if (localStorage.getItem('theme') === 'dark') { |
| html.classList.add('dark'); |
| themeIcon.innerText = '☀️'; |
| } |
| |
| |
| const backToTop = document.getElementById('backToTop'); |
| window.addEventListener('scroll', () => { |
| if (window.pageYOffset > 400) { |
| backToTop.classList.remove('invisible'); |
| backToTop.classList.add('visible', 'opacity-75'); |
| } else { |
| backToTop.classList.add('invisible'); |
| backToTop.classList.remove('visible', 'opacity-100'); |
| } |
| }); |
| |
| backToTop.addEventListener('click', () => { |
| window.scrollTo({ top: 0, behavior: 'smooth' }); |
| }); |
| |
| |
| function openLink(url) { |
| window.open(url, '_blank'); |
| } |
| |
| |
| |
| if ('serviceWorker' in navigator) { |
| window.addEventListener('load', () => { |
| const swCode = ` |
| self.addEventListener('install', (event) => { |
| event.waitUntil(caches.open('opencode-edu-v1').then((cache) => { |
| return cache.addAll(['/', '/index.html']); |
| })); |
| }); |
| self.addEventListener('fetch', (event) => { |
| event.respondWith(caches.match(event.request).then((response) => { |
| return response || fetch(event.request); |
| })); |
| }); |
| `; |
| |
| }); |
| } |
| |
| |
| const sections = document.querySelectorAll('section'); |
| const navLinks = document.querySelectorAll('nav a'); |
| |
| window.addEventListener('scroll', () => { |
| let current = ''; |
| sections.forEach(section => { |
| const sectionTop = section.offsetTop; |
| const sectionHeight = section.clientHeight; |
| if (pageYOffset >= (sectionTop - 100)) { |
| current = section.getAttribute('id'); |
| } |
| }); |
| |
| navLinks.forEach(link => { |
| link.classList.remove('text-primary', 'font-bold'); |
| if (link.getAttribute('href').includes(current)) { |
| link.classList.add('text-primary', 'font-bold'); |
| } |
| }); |
| }); |
| </script> |
|
|
| |
| <script type="application/json" id="manifest"> |
| { |
| "name": "OpenCode EDU Course", |
| "short_name": "OpenCodeEDU", |
| "start_url": ".", |
| "display": "standalone", |
| "background_color": "#f5f5f4", |
| "theme_color": "#0ea5e9", |
| "icons": [ |
| { |
| "src": "https://cdn-icons-png.flaticon.com/512/2103/2103633.png", |
| "sizes": "512x512", |
| "type": "image/png" |
| } |
| ] |
| } |
| </script> |
| </body> |
| </html> |