← المستوى 2 – الساحر

الدرس 8 من 8 ⏱ 60 دقيقة

تحدّ كبير: أحيِ موقعك كله

المهمة الأخيرة للمستوى 2. كل التعاويذ دفعة واحدة – مع أفكار جديدة.

مهمتك

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

الجزء المطلوب 🎯

مرّ على موقعك وتأكد أن التعاويذ الخمس من هذا المستوى حية عليه:

  1. السكربت مربوط على كل صفحة ولا أخطاء في console (F12 – لا شيء أحمر).
  2. الوضع الداكن – مبدّل في الرأس على كل صفحة، والاختيار يُتذكّر.
  3. زر أو عدّاد تفاعلي – تعويذة واحدة على الأقل بمتغير وشرط.
  4. معرض صور مع lightbox – النقر يكبّر الصورة.
  5. اختبار أو نموذج مع validation – واحد على الأقل. يمكنك الاثنين!

امتدادات اختيارية 🌟

اختر واحداً على الأقل (أو ابتكر):

تحية حسب وقت اليوم

الموقع يحيّي بطريقة مختلفة صباحاً ومساءً:

<p id="day-greeting"></p>
const dayGreeting = document.getElementById("day-greeting");
const hour = new Date().getHours();

if (hour < 9) {
  dayGreeting.textContent = "Good morning! ☀️";
} else if (hour < 18) {
  dayGreeting.textContent = "Hi there, have a nice day!";
} else {
  dayGreeting.textContent = "Good evening! 🌙";
}

new Date() يرجع التاريخ والوقت الحالي، .getHours() يسحب الساعة.

رسالة عشوائية عند النقر

نكتة، فكرة رحلة، أو هتاف فريق مختلف في كل مرة:

const messages = [
  "Practice makes perfect!",
  "Let's go, Eagles! 🦅",
  "You miss every shot you don't take.",
  "Fans are the twelfth player.",
];

const messageButton = document.getElementById("message-button");
const messageEl = document.getElementById("message");

messageButton.addEventListener("click", () => {
  const random = Math.floor(Math.random() * messages.length);
  messageEl.textContent = messages[random];
});

Math.random() يرجع رقماً عشوائياً بين 0 و1، وباقي السطر يحوّله لموضع عشوائي في array.

عدّاد زيارات (لك أنت فقط)

كم مرة فتحت موقعك؟ احفظه في localStorage:

let visits = Number(localStorage.getItem("visits") ?? 0);
visits++;
localStorage.setItem("visits", visits);
console.log("You've opened this page " + visits + " times now");

Number(...) يحوّل نصاً من الذاكرة لرقم، و?? 0 يعني “إن لم يكن شيء، ابدأ من صفر.”

قسم قابل للطي (accordion)

أخفِ قائمة طويلة أو roster تحت عنوان قابل للنقر:

const sectionHeading = document.getElementById("expand-heading");
const sectionContent = document.getElementById("expand-content");

sectionHeading.addEventListener("click", () => {
  sectionContent.classList.toggle("hidden");
});

لديك class .hidden { display: none !important; } من درس المعرض.

ارفع النسخة الجديدة إلى الإنترنت

موقعك على GitHub Pages لا يزال النسخة القديمة من المستوى 1! ارفع الجديد:

  1. افتح repository على github.com،
  2. Add file → Upload files،
  3. اسحب الملفات المتغيّرة (mainly script.js، style.css، وكل .html) واضغط Commit changes.

خلال دقيقة، تعاويذك تعمل للجميع.

تهانينا، أيها الساحر! 🪄 موقعك لم يعد جميلاً فقط – بل حي. يتفاعل مع النقرات، يتذكّر الاختيارات، يسأل ويجيب. وتعرف كيف يعمل كل سطر. في المستوى 3 – Master، ستتعلّم بناء مواقع كالمحترفين: React، components، وخادمك الخاص.

ما ستخرج به من هذا المستوى

🏆 شهادتك

خاتمة الساحر

عند وضع علامة على كل درس، يمكنك طباعة شهادة.