إيه اللي بيحصل لما تفتح موقع؟ رحلة الصفحة من السيرفر لشاشتك
بتكتب mo3ty.com وتدوس Enter. في أقل من ثانية الصفحة ظهرت. تعالَ نشوف الـ 6 خطوات اللي حصلت.
1
الرحلة
بتكتب العنوان
←
DNS يحوّل الاسم لرقم IP
←
السيرفر يبعت الملفات
←
المتصفح يقرأ HTML
←
يجيب CSS و JS
←
يرسم الصفحة
1DNS: المتصفح بيسأل "mo3ty.com ده عنوانه الرقمي إيه؟" — زي دليل التليفونات. الجواب: 104.21.5.8
2 بيبعت طلب HTTP للعنوان ده: "هات لي الصفحة الرئيسية".
3 السيرفر بيرد بملف index.html.
4 المتصفح بيقرأ الـ HTML سطر سطر. كل ما يلاقي <link> أو <script> أو <img> بيطلب الملف ده كمان.
5 بيبني شجرة من العناصر (DOM)، ويطبّق عليها الـ CSS.
6 بيحسب مكان كل عنصر وحجمه (Layout)، وبعدين يرسم البكسلات على الشاشة.
2
الـ 3 لغات — مين بيعمل إيه
اللغة
دورها
لو شلتها
HTML
الهيكل: عنوان، فقرة، زرار، صورة
مفيش صفحة أصلًا
CSS
الشكل: ألوان، أحجام، أماكن
صفحة بيضا بخط أسود فوق بعض
JavaScript
التفاعل: لما تدوس، لما تكتب، جيب بيانات
صفحة ثابتة — مفيش حاجة بتتحرك
تشبيه 🏠
البيت: HTML = الحيطان والأوض والأبواب. CSS = الدهان والأثاث والستاير. JavaScript = الكهربا — اللمبة تنوّر لما تدوس، الباب يفتح لما تدوس الجرس.
3
يعني إيه DOM؟
المتصفح بيحوّل الـ HTML لـشجرة في الذاكرة. كل عنصر = فرع. وده اللي JavaScript بتتعامل معاه (بتغيّر الشجرة، فالصفحة بتتغيّر).
html
├── head
│ └── title
└── body
├── h1 "أهلًا"
├── p "مرحبًا بيك"
└── button "اضغط"
افتكر الكلمة دي:DOM = Document Object Model = "الصفحة كشجرة أقدر أعدّل فيها بالكود". هتسمعها في كل مكان.
?
يلا نبدأ بالهيكل… HTML
3/25→
?
HTML — هيكل الصفحة الوسوم · الهيكل الأساسي · أول صفحة ليك
HTML مش لغة برمجة — هي لغة وصف: بتقول للمتصفح "ده عنوان، دي فقرة، ده زرار". كل حاجة بتتكتب جوه وسم (Tag) بيفتح وبيقفل.
1
شكل الوسم
<p>مرحبًا</p>
وسم فتح + المحتوى + وسم قفل (بشرطة مايلة /)
<a href="https://mo3ty.com">زورنا</a>
الـ attribute = معلومة إضافية عن الوسم (الرابط رايح فين)
الوسم
يعني
مثال
h1 … h6
عنوان (1 الأكبر)
<h1>الرئيسية</h1>
p
فقرة
<p>نص</p>
a
رابط
<a href="…">
img
صورة
<img src="cat.jpg">
button
زرار
<button>اضغط</button>
div
صندوق عام
لتجميع عناصر
ul / li
قايمة / عنصر فيها
<ul><li>…
2
أول صفحة كاملة
index.html
1<!DOCTYPE html> 2<html lang="ar" dir="rtl"> 3<head> 4<meta charset="UTF-8"> 5<title>موقعي</title> 6</head> 7<body> 8<h1>أهلًا بيك 👋</h1> 9<p>ده أول موقع ليا.</p>10<button>اضغط هنا</button>11</body>12</html>
localhost/index.html
أهلًا بيك 👋
ده أول موقع ليا. اضغط هنا
head معلومات عن الصفحة (العنوان، الترميز) — مش بتظهر
body كل اللي بيظهر على الشاشة
جرّب دلوقتي: افتح Notepad، انسخ الكود، احفظه باسم index.html، ودبل كليك عليه. مبروك — ده موقع. مش محتاج أي برنامج. و dir="rtl" بتخلّي الصفحة من اليمين للشمال عشان العربي.
?
الصفحة شكلها فقير… يلا نديها شكل بالـ CSS
4/25→
?
HTML بمعنى Semantic + الفورم الوسوم اللي بتقول "أنا إيه" — وإزاي تاخد بيانات من المستخدم
1
ليه مش div لكل حاجة؟
ممكن تبني صفحة كلها <div>. بس المتصفح وجوجل وقارئ الشاشة للمكفوفين مش هيفهموا إيه الهيدر وإيه المقال. الوسوم "بمعنى" بتقول:
<header> اللوجو والقايمة
<nav> روابط التنقل
<main> المحتوى الأساسي — <article> · <section>
<aside> الجانبي
<footer> الحقوق والروابط
تشبيه 🏷️
كراتين النقل: ممكن تكتب "حاجات" على كلها. بس لو كتبت "مطبخ" و"أوضة نوم" أي حد يساعدك في الفك هيعرف يحطها فين. المتصفح وجوجل هما اللي بيساعدوك.
الحاجات اللي بتفرق:name = اللي الـ Backend هيستلم بيه القيمة (من غيره مش بتتبعت) · required = لازم تتملي · <label> مربوط بالـ input عشان لما تدوس على الكلمة الخانة تتفعّل · alt على الصور = وصف للمكفوفين ولو الصورة ما اتحمّلتش
?
الشكل بقى… CSS من الأول
5/25→
?
CSS — شكل الصفحة المحدد والخاصية والقيمة — وإزاي تربطها بالـ HTML
CSS = قواعد بتقول "العناصر دي شكلها كده". كل قاعدة = مين (المحدد) + إيه (الخاصية) + قد إيه (القيمة).
1
شكل القاعدة
h1 {
color: red;
font-size: 32px;
}
المحدد h1 ← كل العناوين · الخاصية color ← اللون · القيمة red
المحدد
بيختار
مثال
p
كل وسوم p
p {…}
.card
كل اللي عليه class="card"
.card { … }
#logo
العنصر اللي id="logo" (واحد بس)
#logo { … }
p a
روابط جوه فقرات
p a {…}
a:hover
الرابط لما الماوس عليه
a:hover { … }
القاعدة: استخدم class للشكل (بتتكرر). id للعنصر الفريد بس. ومتستخدمش الوسم لوحده في المشاريع الكبيرة.
الأخص بيكسب. ولو نفس القوة ← اللي مكتوب آخر بيكسب.
تشبيه 📢
أوامر من مدير عام "كل الموظفين لبس أزرق" (الوسم)، ومدير القسم "قسم المبيعات أحمر" (class)، ومديرك المباشر "إنت بالذات أخضر" (id). هتلبس أخضر — الأقرب ليك بيكسب. و !important = أمر من صاحب الشركة، متستخدمهوش إلا للضرورة.
?
كل عنصر في الصفحة صندوق… يعني إيه Box Model؟
6/25→
?
كل حاجة صندوق Box Model Margin · Border · Padding · Content — أهم فكرة في CSS
أي عنصر في الصفحة (نص، صورة، زرار) المتصفح شايفه مستطيل. وكل مستطيل ليه 4 طبقات من جوه لبره.
1
الطبقات الأربعة
margin — المسافة بره
border — الحدود
padding — المسافة جوه
content المحتوى
تشبيه 🖼️
لوحة على الحيطة: المحتوى = الرسمة. Padding = الكرتون الأبيض حوالين الرسمة جوه البرواز. Border = البرواز نفسه. Margin = المسافة بين البرواز واللوحة اللي جنبه.
الحاوية = قضيب القطار. العربيات (الأبناء) بتتصف عليه تلقائي. إنت بتقرر: القضيب أفقي ولا رأسي، والعربيات متلزّقة ولا بينهم مسافة، وفي الأول ولا النص ولا الآخر.
2
التوزيع والمحاذاة
justify-content — على المحور الأساسي (أفقي في الصف):
1
2
flex-start
1
2
center
1
2
3
space-between
align-items — على المحور التاني (رأسي في الصف): center بيوسّط رأسيًا.
JavaScript — الصفحة بتتحرك المتغيرات · الأنواع · الدوال — في صفحة واحدة
JavaScript = لغة برمجة حقيقية بتشتغل جوه المتصفح. هي اللي بتخلّي الزرار يعمل حاجة لما تدوسه، والقايمة تفتح، والبيانات تيجي من غير ما الصفحة تتحمّل تاني.
1
المتغيرات والأنواع
basics.js
1const name = "Ahmed"; // نص — مش هيتغيّر 2let age = 25; // رقم — ممكن يتغيّر 3let isOnline = true; // صح/غلط 4let nothing = null; // فاضي عمدًا 5 6const user = { // كائن: مجموعة خصائص 7 name: "Sara",
8 age: 30,
9 };
10const colors = ["red", "blue"]; // مصفوفة1112 console.log(user.name); // Sara13 console.log(colors[0]); // red
const ولا let؟ ابدأ دايمًا بـ const. لو احتجت تغيّر القيمة حوّلها let. وvar قديمة — متستخدمهاش.
2
الدوال — كود بتناديه بالاسم
functions.js
1// الطريقة التقليدية 2function greet(name) {
3return"أهلًا يا " + name;
4 }
5 6// Arrow function — الأحدث والأقصر 7const greet = (name) => "أهلًا يا " + name;
8 9// Template literal — نص فيه متغيرات10const greet = (name) => `أهلًا يا ${name}`;
1112 console.log(greet("Ali")); // أهلًا يا Ali
تشبيه 🧾
الدالة زي وصفة باسم: تكتبها مرة، وتناديها كل ما تحتاجها. الـ Arrow function نفس الوصفة بس مكتوبة باختصار.
فين بتتكتب؟ في ملف app.js وتربطه قبل </body>: <script src="app.js"></script>
1// عنصر واحد — بنفس محددات CSS2const title = document.querySelector("#title");
34// كل العناصر اللي بتطابق5const msgs = document.querySelectorAll(".msg");
67 console.log(title.textContent); // أهلًا8 console.log(msgs.length); // 2
تشبيه 🎯
querySelector = "هات لي أول واحد شكله كده". querySelectorAll = "هات لي كلهم". وبتستخدم نفس طريقة الاختيار بتاعة CSS.
2
غيّره
app.js
1// النص 2 title.textContent = "مرحبًا يا أحمد";
3 4// الشكل (CSS من الكود) 5 title.style.color = "red";
6 7// الأفضل: ضيف/شيل class 8 title.classList.add("highlight");
9 title.classList.remove("highlight");
10 title.classList.toggle("dark"); // لو موجود شيله، لو مش موجود ضيفه1112// الخصائص13 img.src = "new.jpg";
14 input.value = ""; // فضّي الخانة
ليه classList أحسن من style؟ الشكل يفضل في CSS، و JS تقول بس "فعّل الحالة دي". كده الكود منظّم والمصمّم يقدر يعدّل من غير ما يلمس JS.
3
أضف وامسح
1// اعمل عنصر جديد2const li = document.createElement("li");
3 li.textContent = "عنصر جديد";
45// ضيفه في القايمة6 document.querySelector("ul").append(li);
78// امسح9 li.remove();
1// أو اكتب HTML مباشرة (للسرعة)2 list.innerHTML = `
3 <li>واحد</li>
4 <li>اتنين</li>
5 `;
⚠️ innerHTML + بيانات من المستخدم = XSS، لو هتعرض نص كتبه حد. استخدم textContent.
?
طيب الكود ده يشتغل إمتى؟ لما المستخدم يدوس!
13/25→
?
الأحداث Events "لما المستخدم يعمل كذا، نفّذ كذا"
كل حاجة المستخدم بيعملها = حدث: ضغط، كتابة، تمرير، تحريك ماوس. إنت بتقول للمتصفح: "لما الحدث ده يحصل على العنصر ده، شغّل الدالة دي".
النمط ده مهم: الحالة (count) في متغير · دالة render بتحدّث الشاشة من الحالة · الأحداث بتغيّر الحالة وتنادي render. ده بالظبط اللي React بيعمله — بس تلقائي.
Event Delegation: بدل ما تحط listener على 100 زرار، حطه على الأب الواحد واعرف مين اتضغط من e.target. أخف وبيشتغل مع العناصر اللي هتتضاف بعدين.
?
عايز أجيب بيانات من السيرفر من غير ما الصفحة تتحمّل تاني؟
14/25→
?
الانتظار الذكي Async و fetch إزاي تجيب بيانات من السيرفر من غير ما الصفحة تتجمّد
طلب للسيرفر بياخد نص ثانية. لو JavaScript استنّت، الصفحة هتتجمّد والمستخدم مش هيقدر يعمل حاجة. الحل: ابعت الطلب وكمّل شغلك، ولما الرد يوصل نفّذ اللي عايزه.
1
المشكلة والحل
تشبيه ☕
في الكافيه: Synchronous = تطلب قهوة وتقف قدام الكاونتر متحركش لحد ما تيجي. Asynchronous = تطلب، تاخد رقم، تقعد على الترابيزة وتكمّل شغلك، ولما الرقم ينادى تروح تاخدها. الـ Promise = الرقم اللي أخدته.
JSON = شكل نصي للبيانات بيفهمه كل حاجة. JSON.stringify يحوّل الكائن لنص عشان يتبعت. res.json() يحوّل الرد لكائن تقدر تستخدمه.
الـ Event Loop (سؤال مقابلة):JS بتشتغل على خيط واحد. الحاجات اللي بتستنّى (fetch, setTimeout) بتتحط في طابور، ولما الكود الحالي يخلص بتتنفّذ. عشان كده "ده بيتطبع الأول".
?
الكود بقى كتير ومبعثر… إزاي ننظّمه؟
15/25→
?
JavaScript الحديثة Destructuring · Spread · Modules · Array methods — اللي هتشوفها في أي كود
1
اختصارات هتشوفها في كل مكان
1// Destructuring — فكّ الكائن 2const user = { name: "Sara", age: 30 };
3const { name, age } = user;
4 5// Spread — انسخ وضيف 6const updated = { ...user, age: 31 };
7const all = [...colors, "green"];
8 9// Optional chaining — لو مش موجود مترميش غلط10const city = user.address?.city; // undefined بدل crash1112// Default13const lang = user.lang ?? "ar";
لاحظ النمط: الحالة في مصفوفة · دالة render واحدة بتحوّل الحالة لـ HTML · الأحداث بتغيّر الحالة وتنادي render. ده النمط اللي React مبني عليه.
?
النمط ده لو عملته يدوي في موقع كبير هيبقى جحيم… React!
17/25→
?
ليه React؟ المشكلة اللي بتحلها الـ Frameworks — والمكوّن (Component)
في المشروع اللي فات كتبنا render بإيدنا وقلنا للمتصفح يرسم كل حاجة من الأول. في موقع فيه 50 جزء بيتغيّروا، التتبّع اليدوي ده مستحيل. React بتقول: إنت وصف الشكل حسب الحالة، وأنا هحدّث اللي اتغيّر بس.
1
الفكرة الجوهرية
UI = f(state) الشاشة = دالة في الحالة. غيّر الحالة ← الشاشة تتغيّر لوحدها.
الحالة state
←
React بيقارن القديم بالجديد
←
يحدّث الفرق بس Virtual DOM
←
الشاشة
تشبيه 🧾
في JS العادية إنت بتقول للمتصفح إزاي يغيّر الشاشة خطوة خطوة ("امسح ده، ضيف ده"). في React بتقول إيه الشكل النهائي ("القايمة فيها 3 مهام")، وهي بتعرف لوحدها إيه اللي اتغيّر. زي الفرق بين إنك تدّي السواق الطريق شارع شارع، وبين إنك تقوله العنوان.
2
Component — قطعة ليجو
الموقع بيتقسم لقطع صغيرة بتتعاد استخدامها. كل قطعة = دالة بترجّع HTML (اسمه JSX):
Button.jsx
1function Button({ text, color }) {
2return (
3<button className={color}> 4 {text}
5</button> 6 );
7 }
8 9// الاستخدام — زي وسم HTML جديد اخترعته10<Button text="احفظ" color="blue"/>11<Button text="امسح" color="red"/>
Props المدخلات — بتيجي من الأب، مش بتتغيّر جوه المكوّن
JSXHTML جوه JavaScript. الـ { } = "هنا JS"
فروق صغيرة:className بدل class · الوسم لازم يتقفل <img /> · المكوّن اسمه بحرف كبير
3
الموقع كشجرة مكوّنات
App
├── Header
│ ├── Logo
│ └── Nav
├── ProductList
│ ├── ProductCard ← نفس المكوّن 20 مرة ببيانات مختلفة
│ ├── ProductCard
│ └── ProductCard
└── Footer
تشبيه 🧱
ليجو: بتبني قطعة "كارت منتج" مرة واحدة، وبتستخدمها 100 مرة. عايز تغيّر شكل الكروت كلها؟ تعدّل القطعة مرة واحدة. وكل قطعة ممكن تتبني من قطع أصغر.
?
طيب الحالة (state) دي بتتعمل وبتتغيّر إزاي؟
18/25→
?
الحالة useState و useEffect الـ Hooks الاتنين اللي هتستخدمهم في 90% من الوقت
key في القوايم: لما تعمل map على مصفوفة، كل عنصر لازم key فريد (id مش index). React بتستخدمه عشان تعرف مين اتغيّر ومين اتمسح من غير ما تعيد رسم الكل. من غيره هتاخد تحذير وأحيانًا سلوك غريب.
?
البيانات محتاجة تتنقل بين المكوّنات…
19/25→
?
تدفّق البيانات والنظام البيئي Props down · Events up · Context · Router · الأدوات
1
القاعدة: البيانات تنزل، الأحداث تطلع
App state: cart = [...]
↓ props: cart · onAdd
ProductList
↓ props: product · onAdd
ProductCard onClick → onAdd(product)
الحالة في الأب. الابن بياخدها كـ props. لما الابن عايز يغيّرها بينادي دالة جات له من الأب.
الشركة: المعلومات بتنزل من المدير للموظفين (props). الموظف مش بيغيّر قرار المدير بنفسه — بيرفع طلب (event) والمدير هو اللي يقرر ويبلّغ الكل.
2
Context — لما الشجرة تطول
المستخدم الحالي محتاج في 30 مكوّن. تمرّره props عبر 6 مستويات؟ (Prop Drilling — مرهق). Context = صندوق مشترك أي مكوّن يقرأ منه مباشرة:
1const UserContext = createContext();
23// فوق4<UserContext.Provider value={user}>5<App/>6</UserContext.Provider>78// في أي مكوّن تحت مهما كان بعيد9const user = useContext(UserContext);
الحالة
الحل
بين أب وابن
props
في 3+ مستويات
Context
معقّدة ومشتركة في كل التطبيق
Redux · Zustand
جاية من السيرفر
React Query · SWR
3
النظام البيئي — الحاجات اللي حوالين React
المشكلة
الأداة
في سطر
صفحات متعددة بدون reload
React Router
<Route path="/users/:id">
بداية مشروع
Vite
npm create vite@latest
إطار كامل (SSR، routing، API)
Next.js
الأكثر طلبًا في الوظائف
تنسيق سريع
Tailwind CSS
class="flex gap-4 p-2"
أنواع للكود
TypeScript
بيمسك الأخطاء قبل التشغيل
بدائل React
Vue · Svelte · Angular
نفس الأفكار بشكل مختلف
نصيحة: اتقن JavaScript الأول (الصفحات اللي فاتت). React من غير JS قوية = حفظ من غير فهم. وبعدين React + TypeScript + Next.js = الكومبو اللي السوق عايزه.
?
الموقع شغّال… بس بطيء. إزاي أخلّيه سريع؟
20/25→
?
الأداء Performance ليه الموقع بطيء وإزاي تقيس وتصلّح
كل ثانية تأخير = 7% من الزوار بيمشوا. وجوجل بتحط الموقع البطيء تحت في النتايج. الأداء مش رفاهية.
1
قيس الأول — Lighthouse
في Chrome: F12 ← تاب Lighthouse ← Analyze. بيديك درجة من 100 وقايمة بالمشاكل.
المقياس
يعني
الهدف
LCP
أكبر عنصر ظهر إمتى (الصورة الرئيسية)
< 2.5s
INP
الصفحة بترد على الضغط بسرعة؟
< 200ms
CLS
العناصر بتنطّ وإنت بتقرأ؟
< 0.1
دول الـ Core Web Vitals — اللي جوجل بتقيس بيهم
تشبيه 🏥
متعالجش قبل ما تشخّص. Lighthouse = الأشعة. بيقولك المشكلة فين بالظبط بدل ما تحسّن حاجات عشوائية.
2
أكبر 5 أسباب للبطء
السبب
الحل
صور ضخمة (أشهر سبب!)
اضغطها · WebP · loading="lazy" · أحجام مختلفة بـ srcset
JS كتير بيتحمّل مرة واحدة
Code splitting — حمّل كل صفحة لما تتفتح
طلبات كتير للسيرفر
جمّع الملفات · كاش · CDN
CSS/JS بيوقّف الرسم
defer على السكريبت · CSS الحرج inline
إعادة رسم كتير
متغيّرش الـ DOM في loop · استخدم transform بدل top/left
width/height على الصورة بيمنع النطّ (CLS). defer = حمّل من غير ما توقّف الصفحة.
3
في React تحديدًا
1// حمّل الصفحة لما تتفتح بس2const Admin = lazy(() =>import("./Admin"));
34// متعيدش حساب تقيل في كل رسم5const total = useMemo(() => calc(items), [items]);
67// متعيدش رسم مكوّن لو props متغيّرتش8exportdefault memo(ProductCard);
القاعدة: متحسّنش قبل ما تقيس. 90% من مشاكل أداء React سببها إعادة رسم مكوّنات مش محتاجة. React DevTools → Profiler بيوريك مين بيترسم كتير.
?
والموقع يشتغل للمكفوفين؟ ويظهر في جوجل؟
21/25→
?
الوصولية a11y و SEO موقع الكل يقدر يستخدمه، وجوجل تلاقيه
1
الوصولية — 15% من الناس
مكفوفين بيستخدموا قارئ شاشة، ناس مش بتقدر تستخدم ماوس، عمى ألوان. الموقع لازم يشتغل ليهم. والخبر الحلو: أغلبها HTML صح.
القاعدة
ليه
وسوم بمعنى (button مش div)
قارئ الشاشة يعرف ده زرار ويتفعّل بالكيبورد
alt على كل صورة
المكفوف يسمع وصفها
label لكل input
يعرف الخانة دي لإيه
تباين ألوان كافي (4.5:1)
ضعاف النظر يقروا
كل حاجة تتعمل بالكيبورد (Tab)
اللي مش بيستخدم ماوس
h1 → h2 → h3 بالترتيب
هيكل مفهوم
تشبيه 🏢
المبنى اللي فيه منحدر للكراسي المتحركة بيفيد كمان الأم بعربية الأطفال وعامل التوصيل. التسهيلات بتفيد الكل.
مبروك! بقيت Frontend Developer الخلاصة + خريطة الطريق
1
الرحلة كلها في رسمة
HTML الهيكل
←
CSS Box · Flex · Grid · Responsive
←
JavaScript DOM · Events · Async
←
React Components · State · Hooks
←
الأداء والجودة Performance · a11y · SEO
←
النشر Git · Vercel
كل مرحلة بتبني على اللي قبلها. اللي بيقفز لـ React من غير JavaScript قوية بيرجع بعد شهرين.
2
اختبر نفسك ✍️
1. عنصر width: 300px وpadding: 20px وborder: 5px — عرضه الكلي كام؟ (من غير border-box)
2. إزاي تخلّي 3 كروت جنب بعض على الديسكتوب وتحت بعض على الموبايل؟
3. ليه console.log بعد fetch بيتطبع قبل البيانات؟
4. في React غيّرت count = 5 مباشرة والشاشة ما اتغيّرتش. ليه؟
5. إيه الفرق بين textContent وinnerHTML وإمتى كل واحد خطر؟
6. الموقع بطيء — أول حاجة تعملها؟
1) 350px · 2) Grid + media query أو Flex مع wrap · 3) fetch غير متزامن — الكود بيكمّل ومش بيستنّى · 4) لازم setCount عشان React تعرف · 5) innerHTML بيفسّر HTML (خطر XSS مع بيانات المستخدم)، textContent نص بس · 6) قيس بـ Lighthouse — غالبًا الصور
3
الخطوة الجاية 🗺️
1ابني 3 مشاريع بـ HTML/CSS/JS بس: صفحة شخصية · آلة حاسبة · تطبيق طقس (API). انشرهم.
2اتعلم React من الموقع الرسمي react.dev — أحسن مصدر. أعد بناء المشاريع بيه.
3TypeScript — أسبوع واحد بيفرق في كل حاجة بعده.
4Next.js + مشروع كامل فيه تسجيل دخول وبيانات من API.
5GitHub منظّم + موقع شخصي بمشاريعك = الـ CV الحقيقي.
الأهم:Frontend بيتعلم بالعين والإيد. كل صفحة في الكتاب ده — اكتب الكود بتاعها وشوفه في المتصفح. القراءة لوحدها مبتعلّمش CSS.