{"checkpoints":{"s-css-1":[{"q":"<p>ما لون الرابط؟</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"css\" data-index=\"0\"><div class=\"code-head\"><span class=\"code-title\">CSS</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">@layer</span><span style=\"color:#953800;--shiki-dark:#FFA657\"> base</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">components</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">;</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">@layer</span><span style=\"color:#953800;--shiki-dark:#FFA657\"> components</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> {</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">  .btn</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> { </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">color</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">white</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">; }</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">}</span></span>\n<span class=\"line\"><span style=\"color:#116329;--shiki-dark:#7EE787\">a</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> { </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">color</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">blue</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">; }</span></span></code></pre></div>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"html\" data-index=\"1\"><div class=\"code-head\"><span class=\"code-title\">HTML</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">&#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">a</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> class</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"btn\"</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> href</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"#\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>Buy tickets&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">a</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span></code></pre></div>\n","options":[{"text":"white، لأن <code dir=\"ltr\">components</code> هي آخر layer مُعلنة.","why":"كونها آخر layer مسمّاة لا يجعلها تتغلّب إلا على الـ layers المسمّاة الأخرى؛ أما القاعدة الواقعة خارج الـ layers فتتفوّق عليها كلها."},{"text":"blue، لأن الأنماط العادية خارج الـ layers تتغلّب على كل layer.","why":"صحيح. الأنماط خارج الـ layers تجلس في layer ضمنية فوق كل الـ layers المسمّاة، فيفوز selector النوع رغم أن الـ specificity الخاصة به أقل."},{"text":"white، لأن الـ class أدقّ تحديدًا من selector النوع.","why":"الـ specificity لا تُقارَن إلا داخل الـ layer نفسها. وأولوية الـ layers تُحسم أولًا."},{"text":"لون الروابط الافتراضي في المتصفّح، لأن القاعدتين تلغي إحداهما الأخرى.","why":"القواعد لا تلغي بعضها أبدًا؛ الـ cascade يختار دائمًا فائزًا واحدًا."}],"answer":1},{"q":"<p>القاعدتان تستهدفان <code dir=\"ltr\">&lt;h3 class=&quot;title&quot;&gt;</code> داخل <code dir=\"ltr\">.card</code>. أيّ لون يفوز؟</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"css\" data-index=\"2\"><div class=\"code-head\"><span class=\"code-title\">CSS</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">:where</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">.card</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">) </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">.title</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> { </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">color</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">green</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">; }</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">.title</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> { </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">color</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">red</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">; }</span></span></code></pre></div>\n","options":[{"text":"red، لأن درجة الـ selectorين (0,1,0) والأحمر يأتي لاحقًا.","why":"صحيح. <code dir=\"ltr\">:where()</code> لا تضيف شيئًا، فتتعادل الـ specificity ويحسم ترتيب الظهور."},{"text":"green، لأنه أدقّ تحديدًا.","why":"<code dir=\"ltr\">:where(.card)</code> تضيف specificity صفرًا، فدرجة selector الأخضر (0,1,0) نفسها درجة الأحمر."},{"text":"green، لأن selectors العناصر الداخلية تتغلّب على الـ selectors المفردة.","why":"الروابط بين الـ selectors لا تضيف specificity؛ ولا يُحسب إلا الـ selectors البسيطة."},{"text":"لا هذا ولا ذاك؛ <code dir=\"ltr\">:where()</code> تجعل القاعدة الأولى غير صالحة.","why":"<code dir=\"ltr\">:where()</code> صالحة في كل مكان وتظل تطابق؛ لكنها لا تزن شيئًا."}],"answer":0},{"q":"<p>يُفترض أن يكبر توهّج بطاقة عند المرور بـ <code dir=\"ltr\">transition: --glow 300ms</code>، مع <code dir=\"ltr\">box-shadow: 0 0 var(--glow) violet</code>. لكن التوهّج يقفز بدل أن يتحرّك. ما الإصلاح؟</p>","options":[{"text":"أضف <code dir=\"ltr\">transition-behavior: allow-discrete</code> ليُسمح للـ custom property بالدخول في transition.","why":"<code dir=\"ltr\">allow-discrete</code> تتيح لقيمة لا يمكن الانتقال بين قيمها تدريجيًا أن تشارك في الـ transition، لكنها تظل تنقلب دفعة واحدة عند منتصف المدة. المتصفّح يحتاج إلى أن يعرف أن <code dir=\"ltr\">--glow</code> طول ليمزج بين قيمها."},{"text":"انقل <code dir=\"ltr\">--glow</code> إلى <code dir=\"ltr\">:root</code> لتُورَث.","why":"مكان تعريف الخاصية لا يغيّر قابليتها للانتقال التدريجي."},{"text":"سجّل <code dir=\"ltr\">--glow</code> بـ <code dir=\"ltr\">@property</code> مع <code dir=\"ltr\">syntax: &quot;&lt;length&gt;&quot;</code> وقيمة ابتدائية.","why":"صحيح. حين يعرف المتصفّح أن <code dir=\"ltr\">--glow</code> طول، يستطيع الانتقال بين قيمها تدريجيًا، فيتحرّك الظلّ بسلاسة."},{"text":"أضف <code dir=\"ltr\">will-change: --glow</code>.","why":"<code dir=\"ltr\">will-change</code> تلميح للأداء؛ ولا تجعل القيمة التي بلا نوع قابلة للتحريك."}],"answer":2},{"q":"<p>الـ HTML هو <code dir=\"ltr\">&lt;label class=&quot;field&quot;&gt;Email &lt;input type=&quot;email&quot;&gt;&lt;/label&gt;</code>. أيّ selector ينسّق التسمية (label) حين يكون الـ focus على حقلها؟</p>","options":[{"text":"<code dir=\"ltr\">.field:focus</code>","why":"التسمية نفسها لا تستقبل الـ focus أبدًا؛ الحقل الذي بداخلها هو الذي يستقبله."},{"text":"<code dir=\"ltr\">input:focus + .field</code>","why":"الرابط <code dir=\"ltr\">+</code> يبحث عن شقيق لاحق، لكن التسمية هي أب الحقل."},{"text":"<code dir=\"ltr\">.field &gt; input:focus</code>","why":"هذا يحدّد الحقل، لا التسمية."},{"text":"<code dir=\"ltr\">.field:has(input:focus)</code>","why":"صحيح. تطابق التسمية حين تحتوي على حقل عليه الـ focus. و<code dir=\"ltr\">.field:focus-within</code> ستنجح هنا أيضًا."}],"answer":3},{"q":"<p>داخل قاعدة <code dir=\"ltr\">.session-card</code> متداخلة، أيّ selector يستهدف البطاقة نفسها حين تحمل أيضًا الـ class <code dir=\"ltr\">is-live</code>؟</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"css\" data-index=\"3\"><div class=\"code-head\"><span class=\"code-title\">CSS</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">.session-card</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> {</span></span>\n<span class=\"line\"><span style=\"color:#6E7781;--shiki-dark:#8B949E\">  /* ??? */</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> { </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">border-color</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">red</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">; }</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">}</span></span></code></pre></div>\n","options":[{"text":"<code dir=\"ltr\">&amp; .is-live</code>","why":"المسافة تجعله selector لعنصر داخلي: عنصر <code dir=\"ltr\">.is-live</code> داخل البطاقة."},{"text":"<code dir=\"ltr\">.is-live</code>","why":"الـ selector المتداخل بلا <code dir=\"ltr\">&amp;</code> يُعامَل كعنصر داخلي، فهذا أيضًا يعني عنصرًا داخل البطاقة."},{"text":"<code dir=\"ltr\">&amp;:is-live</code>","why":"<code dir=\"ltr\">:is-live</code> ليست pseudo-class، فالـ selector غير صالح."},{"text":"<code dir=\"ltr\">&amp;.is-live</code>","why":"صحيح. دون مسافة تشكّل <code dir=\"ltr\">&amp;</code> و<code dir=\"ltr\">.is-live</code> selector مركّبًا واحدًا: <code dir=\"ltr\">.session-card.is-live</code>."}],"answer":3}],"s-css-2":[{"q":"<p>صفحة بـ <code dir=\"ltr\">display: flex</code> فيها شريط جانبي بعرض 16rem و<code dir=\"ltr\">main</code> له <code dir=\"ltr\">flex: 1</code>. جدول بيانات عريض داخل <code dir=\"ltr\">main</code> يدفع الصفحة إلى التمرير الأفقي. ما الإصلاح الموجَّه؟</p>","options":[{"text":"أضف <code dir=\"ltr\">min-width: 0</code> إلى <code dir=\"ltr\">main</code> ودع الجدول يتمرّر داخل غلاف خاص به له <code dir=\"ltr\">overflow-x: auto</code>.","why":"صحيح. الحدّ الأدنى التلقائي لعرض <code dir=\"ltr\">main</code> هو عرض محتواه؛ وإزالته تتيح لـ <code dir=\"ltr\">main</code> أن يتقلّص، وتحصر الفيضان حيث ينتمي."},{"text":"أضف <code dir=\"ltr\">flex-shrink: 1</code> إلى <code dir=\"ltr\">main</code>.","why":"<code dir=\"ltr\">flex-shrink: 1</code> هي القيمة الافتراضية أصلًا؛ والتقلّص يتوقّف عند الحدّ الأدنى التلقائي على أيّ حال."},{"text":"اضبط <code dir=\"ltr\">overflow: hidden</code> على <code dir=\"ltr\">body</code>.","why":"هذا يخفي محتوى يحتاجه المستخدمون ويجعل قراءة الجدول مستحيلة على الشاشات الصغيرة."},{"text":"غيّر <code dir=\"ltr\">flex: 1</code> إلى <code dir=\"ltr\">flex: auto</code> على <code dir=\"ltr\">main</code>.","why":"<code dir=\"ltr\">auto</code> تجعل <code dir=\"ltr\">main</code> يبدأ من عرض محتواه، فيزيد الفيضان سوءًا لا تحسّنًا."}],"answer":0},{"q":"<p>شبكة تستخدم <code dir=\"ltr\">grid-template-columns: repeat(auto-fill, minmax(200px, 1fr))</code> بلا فجوة في حاوية عرضها 500px. كم عمودًا فيها، وما عرض كلٍّ منها؟</p>","options":[{"text":"عمودان بعرض 200px و100px من المساحة الفارغة.","why":"الحدّ الأقصى <code dir=\"ltr\">1fr</code> يتيح للـ tracks أن تكبر لتتقاسم المساحة المتبقية."},{"text":"عمودان بعرض 250px.","why":"صحيح. يتّسع اثنان من الـ tracks بعرض 200px ولا يتّسع الثالث، ثم يقسم الحدّ الأقصى <code dir=\"ltr\">1fr</code> الـ 100px المتبقية بين الاثنين."},{"text":"ثلاثة أعمدة بعرض يقارب 167px.","why":"لكل track حدّ أدنى 200px، فلا تتّسع ثلاثة في 500px."},{"text":"عمود واحد بعرض 500px.","why":"<code dir=\"ltr\">auto-fill</code> تنشئ أكبر عدد من الـ tracks يتّسع بحجمها الأدنى، وهو اثنان هنا."}],"answer":1},{"q":"<p>نموذج تسجيل المتحدّثين فيه ثلاثة fieldsets، في كلٍّ منها أزواج من التسميات والحقول. يجب أن تشكّل التسميات عمودًا واحدًا متساوي العرض عبر كل الـ fieldsets. والنموذج شبكة من عمودين. ماذا تضيف إلى كل fieldset؟</p>","options":[{"text":"<code dir=\"ltr\">display: grid; grid-template-columns: max-content 1fr;</code>","why":"كل fieldset يحدّد عرض عمود تسمياته بنفسه، فلا توسّع تسمية طويلة في أحدها الأخرى."},{"text":"<code dir=\"ltr\">display: contents;</code>","why":"قد يحاذي هذا الحقول، لكنه يزيل صندوق الـ fieldset (وحدّه وتخطيط الـ legend فيه)، فينكسر التجميع."},{"text":"<code dir=\"ltr\">display: grid; grid-column: span 2; grid-template-columns: subgrid;</code>","why":"صحيح. كل fieldset يمتدّ على عمودي النموذج ويتبنّاهما، فتتشارك كل التسميات track عمود واحدًا."},{"text":"<code dir=\"ltr\">width: 100%;</code>","why":"العرض لا يربط الأعمدة الداخلية للـ fieldsets ببعضها."}],"answer":2},{"q":"<p>بطاقة جلسة في شريط جانبي عرضه 300px. يتبدّل تخطيطها بـ <code dir=\"ltr\">@container (width &gt; 400px)</code>، والشريط الجانبي هو حاوية الحجم. عرض نافذة المتصفّح 1400px. أيّ تخطيط تحصل عليه البطاقة؟</p>","options":[{"text":"التخطيط الضيّق، لأن الاستعلام يقيس الشريط الجانبي ذا الـ 300px.","why":"صحيح. الـ container queries تتجاهل الـ viewport؛ وما يُقاس هو أقرب حاوية حجم."},{"text":"التخطيط العريض، لأن النافذة أعرض من 400px.","why":"هذا سلوك الـ media query. أما الـ container query فتقيس الحاوية."},{"text":"لا هذا ولا ذاك؛ الـ container queries تحتاج إلى اسم حاوية لتطابق.","why":"الاستعلامات بلا اسم تستخدم أقرب حاوية حجم بين الأسلاف."},{"text":"يعتمد على عرض البطاقة نفسها.","why":"لا يستطيع العنصر أن يستعلم عن نفسه؛ والقياس هو عرض حاوية الشريط الجانبي."}],"answer":0},{"q":"<p>ما العرض الذي تُنتجه <code dir=\"ltr\">width: clamp(280px, 50%, 600px)</code> داخل عنصر أب عرضه 400px؟</p>","options":[{"text":"280px","why":"صحيح. 50% من 400px تساوي 200px، وهي تحت الحدّ الأدنى 280px، فيفوز الحدّ الأدنى."},{"text":"200px","why":"200px هي القيمة المفضّلة، لكن clamp() لا تنزل أبدًا تحت حدّها الأدنى."},{"text":"400px","why":"عرض العنصر الأب ليس إحدى القيم الثلاث؛ تُرجع clamp() الحدّ الأدنى أو المفضّلة أو الحدّ الأقصى."},{"text":"600px","why":"الحدّ الأقصى لا ينطبق إلا حين تتجاوزه القيمة المفضّلة."}],"answer":0}],"s-css-3":[{"q":"<p>يسأل مصمّم لماذا يستخدم عنوان الواجهة الرئيسية <code dir=\"ltr\">clamp(2rem, 1.2rem + 3vw, 3.5rem)</code> لا <code dir=\"ltr\">clamp(32px, 3vw + 19px, 56px)</code>. ما أفضل جواب؟</p>","options":[{"text":"نسخة الـ rem تتدرّج مع حجم الخط الافتراضي لدى المستخدم ومع التكبير؛ أما نسخة الـ px فتقفل المدى على إعدادات المصمّم.","why":"صحيح. حدود rem ونقطة تقاطع بـ rem تُبقي تفضيلات المستخدم داخل الحساب، وعلى هذا يعتمد معيار Resize Text."},{"text":"نسخة الـ px لا تعمل في Safari.","why":"كلتاهما صالحة في كل المتصفّحات الحالية؛ الفرق في إمكانية الوصول لا في الدعم."},{"text":"الـ rem تُرسم أسرع من الـ px.","why":"لا فرق في سرعة الرسم بين الوحدتين."},{"text":"لا يمكنك جمع px وvw داخل clamp().","why":"الوحدات المختلطة مسموحة في الدوال الرياضية؛ و<code dir=\"ltr\">3vw + 19px</code> صالحة."}],"answer":0},{"q":"<p>زر إغلاق موضوع بـ <code dir=\"ltr\">inset-inline-end: 8px</code>. والصفحة <code dir=\"ltr\">dir=&quot;rtl&quot;</code>. إلى أيّ خاصية فيزيائية تُترجَم؟</p>","options":[{"text":"<code dir=\"ltr\">left: 8px</code>","why":"صحيح. في النص المكتوب من اليمين إلى اليسار، نهاية السطر على اليسار."},{"text":"<code dir=\"ltr\">right: 8px</code>","why":"هذا هو المقابل في النص من اليسار إلى اليمين، حيث تنتهي الأسطر على اليمين."},{"text":"<code dir=\"ltr\">top: 8px</code>","why":"<code dir=\"ltr\">top</code> موضع على محور الـ block؛ والخصائص الـ inline تقابل اليسار واليمين في الكتابة الأفقية."},{"text":"لا أثر لها في RTL.","why":"الخصائص المنطقية وُجدت تحديدًا لتعمل في الاتجاهين."}],"answer":0},{"q":"<p>أيّ تصريح يعطي الزر المعطّل لونًا رماديًا بالإضاءة المُدرَكة نفسها التي للون العلامة التجارية؟</p>","options":[{"text":"<code dir=\"ltr\">background: hsl(from var(--brand) h 0% l);</code>","why":"إضاءة HSL ليست إدراكية، فلن تطابق الإضاءة الظاهرة للرمادي إضاءة لون العلامة التجارية."},{"text":"<code dir=\"ltr\">background: oklch(from var(--brand) l 0 h);</code>","why":"صحيح. ضبط التشبّع على 0 يزيل اللونية مع الإبقاء على L، فيبدو الرمادي بالإضاءة نفسها."},{"text":"<code dir=\"ltr\">background: color-mix(in srgb, var(--brand), grey);</code>","why":"المزج مع الرمادي يُبقي نصف اللون ويزيح الإضاءة نحو إضاءة الرمادي، لا إضاءة العلامة التجارية."},{"text":"<code dir=\"ltr\">filter: grayscale(1);</code>","why":"الـ filter يحوّل النص وأيّ أيقونات إلى الرمادي أيضًا، ويعمل في فضاء غير إدراكي."}],"answer":1},{"q":"<p>الصفحة في الوضع الداكن، لكن لوحة «معاينة الطباعة» داخلها يجب أن تُرسم بالقيم الفاتحة لكل tokens <code dir=\"ltr\">light-dark()</code>. ماذا تضبط على اللوحة؟</p>","options":[{"text":"<code dir=\"ltr\">@media (prefers-color-scheme: light)</code> حول قواعد اللوحة.","why":"هذه الـ media query تفحص إعداد نظام تشغيل المستخدم، وهو ما زال داكنًا."},{"text":"<code dir=\"ltr\">data-theme=&quot;light&quot;</code> على اللوحة.","why":"قواعد مفتاح التبديل في هذه الدورة تقرأ <code dir=\"ltr\">data-theme</code> على الجذر، لذا لا تفعل السمة على اللوحة شيئًا ما لم تستهدفها CSS."},{"text":"<code dir=\"ltr\">color-scheme: light;</code>","why":"صحيح. تُحسم <code dir=\"ltr\">light-dark()</code> بحسب النظام اللوني المستخدم في كل عنصر، ويرثه العناصر داخل اللوحة."},{"text":"<code dir=\"ltr\">filter: invert(1);</code>","why":"القلب يعكس الصور وألوان العلامة التجارية أيضًا، ولا يلمس قيم الـ tokens."}],"answer":2},{"q":"<p>تضيف Waypoint شريط «إعدادات ملفات تعريف الارتباط» ثابتًا ارتفاعه 56px أسفل الـ viewport. يبلّغ مستخدمو لوحة المفاتيح أن الرابط الذي عليه الـ focus يختبئ أحيانًا خلفه. أيّ إصلاح يعالج معيار Focus Not Obscured في WCAG؟</p>","options":[{"text":"<code dir=\"ltr\">:focus-visible { outline-offset: 56px; }</code>","why":"إزاحة الحلقة لا تُخرج العنصر من تحت الشريط."},{"text":"<code dir=\"ltr\">.cookie-bar { opacity: 0.9; }</code>","why":"الشفافية الطفيفة تظل تحجب العنصر؛ المعيار يتعلّق باختفائه، لا بمظهر الشريط."},{"text":"<code dir=\"ltr\">body { padding-top: 56px; }</code>","why":"الشريط في الأسفل؛ والحشوة العلوية لا تغيّر المكان الذي تستقرّ فيه العناصر التي عليها الـ focus."},{"text":"<code dir=\"ltr\">html { scroll-padding-bottom: 56px; }</code>","why":"صحيح. الـ scroll padding تحدّد أن الـ 56px السفلية مغطّاة، فيُبقي التمرير الناتج عن الـ focus العنصرَ فوق الشريط."}],"answer":3}],"s-css-4":[{"q":"<p>أيّ زوج من الخصائص يستطيع المتصفّح تحريكه دون إعادة تشغيل التخطيط أو الرسم في كل إطار؟</p>","options":[{"text":"<code dir=\"ltr\">translate</code> و<code dir=\"ltr\">opacity</code>","why":"صحيح. إنهما تغيّران طريقة تركيب طبقة مرسومة أصلًا، فيستطيع المتصفّح تخطّي التخطيط والرسم."},{"text":"<code dir=\"ltr\">width</code> و<code dir=\"ltr\">height</code>","why":"كلتاهما تغيّران الأبعاد، فيعمل التخطيط في كل إطار."},{"text":"<code dir=\"ltr\">top</code> و<code dir=\"ltr\">left</code>","why":"المواضع أبعاد أيضًا؛ وتغييرها يستدعي التخطيط."},{"text":"<code dir=\"ltr\">background-color</code> و<code dir=\"ltr\">box-shadow</code>","why":"هاتان تتخطّيان التخطيط لكنهما تعيدان الرسم في كل إطار."}],"answer":0},{"q":"<p>أثناء view transition في الجدول، يتلاشى رأس الصفحة الثابت تقاطعيًا مع الصفحة، فيبدو كأنه يومض. كيف تُبقيه ثابتًا؟</p>","options":[{"text":"اضبط <code dir=\"ltr\">position: fixed</code> على الرأس.","why":"العناصر الثابتة تُلتقط أيضًا في صورة الـ root، فتتلاشى تقاطعيًا هي الأخرى."},{"text":"اضبط <code dir=\"ltr\">z-index: 1000</code> على الرأس.","why":"ترتيب التراكب في الصفحة الحيّة لا يهمّ أثناء الانتقال؛ الرأس يظل جزءًا من صورة الـ root التي تتلاشى تقاطعيًا."},{"text":"أعطِ الرأس <code dir=\"ltr\">view-transition-name: header</code> واضبط <code dir=\"ltr\">animation: none</code> على <code dir=\"ltr\">::view-transition-group(header)</code>.","why":"صحيح. تسمية الرأس تعطيه مجموعة خاصة به، منفصلة عن التلاشي التقاطعي للـ root، وإزالة حركة تلك المجموعة تُبقيه ثابتًا."},{"text":"أضف <code dir=\"ltr\">will-change: transform</code> إلى الرأس.","why":"هذا تلميح للرسم ولا أثر له في طريقة التقاط الانتقال للرأس."}],"answer":2},{"q":"<p>شريط تقدّم القراءة يستخدم <code dir=\"ltr\">animation: grow ease both; animation-timeline: scroll(root);</code>. في منتصف الصفحة يكون الشريط ممتلئًا بنسبة 80% بالفعل. لماذا؟</p>","options":[{"text":"<code dir=\"ltr\">scroll(root)</code> تقيس الـ viewport لا المستند.","why":"<code dir=\"ltr\">scroll(root)</code> تتتبّع تقدّم حاوية تمرير المستند؛ والتشوّه يأتي من منحنى التسارع."},{"text":"نمط التعبئة <code dir=\"ltr\">both</code> يجعل الشريط يقفز إلى الأمام.","why":"<code dir=\"ltr\">both</code> لا تفعل إلا تطبيق أول keyframe وآخرها خارج النطاق النشط."},{"text":"خطوط زمن التمرير تعمل دائمًا بسرعة مضاعفة في المنتصف.","why":"التقدّم متناسب مع موضع التمرير؛ ومنحنى التسارع وحده هو الذي يغيّر طريقة ربطه بالـ keyframes."},{"text":"منحنى التوقيت <code dir=\"ltr\">ease</code> يربط تقدّم التمرير بشكل غير خطي؛ استخدم <code dir=\"ltr\">linear</code> ليتتبّع الشريط مسافة التمرير بدقّة.","why":"صحيح. دوال التوقيت تظل تنطبق على خطوط زمن التمرير، فيشوّه المنحنى الربط."}],"answer":3},{"q":"<p>أضاف مطوّر جديد <code dir=\"ltr\">.session-card { margin-block-start: 24px; }</code> كي لا تتلامس البطاقات في الشريط الجانبي. ما الذي يجب أن تقترحه المراجعة بدلًا من ذلك؟</p>","options":[{"text":"استخدم <code dir=\"ltr\">margin-top</code> بدلًا منها، من أجل المتصفّحات الأقدم.","why":"الخصائص المنطقية مدعومة في كل مكان؛ المشكلة في أن الـ component يضع مسافاته بنفسه."},{"text":"أضف <code dir=\"ltr\">!important</code> لتصمد الـ margin في التخطيطات الأخرى.","why":"هذا يجعل تعديل الـ margin لكل سياق مستحيلًا، وهو عكس المطلوب."},{"text":"انقل الـ margin إلى layer الـ utilities.","why":"ستظل البطاقة تحمل مسافاتها في كل مكان؛ والشريط الجانبي هو المكان الذي يحتاج إليها."},{"text":"أعطِ تخطيط الشريط الجانبي <code dir=\"ltr\">display: grid</code> (أو flex) مع <code dir=\"ltr\">gap</code>، وأبقِ البطاقة خالية من الـ margins الخارجية.","why":"صحيح. السياق يملك المسافات، فتبقى البطاقة قابلة لإعادة الاستخدام في الشبكة والشريط الجانبي والـ carousel."}],"answer":3},{"q":"<p>أضفت <code dir=\"ltr\">content-visibility: auto</code> إلى قسم كل يوم في جدول طويل ولا شيء غير ذلك. ماذا يلاحظ المستخدمون؟</p>","options":[{"text":"يقفز شريط التمرير كلما رُسمت الأقسام، لأن الأقسام المتخطّاة لا ارتفاع لها حتى يُحسب تخطيطها.","why":"صحيح. <code dir=\"ltr\">contain-intrinsic-size: auto &lt;length&gt;</code> تعطي الأقسام المتخطّاة ارتفاعًا نائبًا وتعالج القفز."},{"text":"تختفي الأقسام الواقعة خارج الشاشة من نتائج البحث داخل الصفحة.","why":"المحتوى الذي تتخطّاه <code dir=\"ltr\">content-visibility: auto</code> يبقى قابلًا للبحث ولإمكانية الوصول."},{"text":"لا يتغيّر شيء، لأن content-visibility لا تعمل إلا مع JavaScript.","why":"إنها CSS خالصة وتأخذ مفعولها فورًا."},{"text":"يُرسم كل قسم مرتين، فتبطؤ الصفحة.","why":"يرسم المتصفّح القسم حين يقترب من الـ viewport؛ ولا يرسمه مرتين."}],"answer":0}]},"final":[{"q":"<p>ما لون الفقرة؟</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"html\" data-index=\"4\"><div class=\"code-head\"><span class=\"code-title\">HTML</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">&#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">p</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> style</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"color: red\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>Doors open at 08:30&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">p</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span></code></pre></div>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"css\" data-index=\"5\"><div class=\"code-head\"><span class=\"code-title\">CSS</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#116329;--shiki-dark:#7EE787\">p</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> { </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">color</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">blue</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> !important</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">; }</span></span></code></pre></div>\n","options":[{"text":"red، لأن الأنماط المضمّنة تفوز دائمًا.","why":"الأنماط المضمّنة تتغلّب على قواعد ملف الأنماط العادية، لكن <code dir=\"ltr\">!important</code> تُحسم في مرحلة أسبق من الـ cascade."},{"text":"red، لأنها أدقّ تحديدًا.","why":"الأنماط المضمّنة لا تُقارَن بالـ specificity؛ والأهمية تُحسم قبل كليهما."},{"text":"blue، لأن قواعد ملف الأنماط تُحمَّل بعد الأنماط المضمّنة.","why":"ترتيب التحميل ليس السبب؛ الأهمية تتفوّق على النمط المضمّن."},{"text":"blue، لأن التصريح المهمّ يتغلّب على النمط المضمّن العادي.","why":"صحيح. الأهمية جزء من أول معايير الـ cascade، وتُفحص قبل الأنماط المضمّنة."}],"answer":3},{"q":"<p>لعنصرٍ السمة <code dir=\"ltr\">hidden</code> والـ class <code dir=\"ltr\">card</code>. ما قيمة display فيه؟</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"css\" data-index=\"6\"><div class=\"code-head\"><span class=\"code-title\">CSS</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">@layer</span><span style=\"color:#953800;--shiki-dark:#FFA657\"> reset</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">components</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">;</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">@layer</span><span style=\"color:#953800;--shiki-dark:#FFA657\"> reset</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> { [</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">hidden</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] { </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">display</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">none</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> !important</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">; } }</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">@layer</span><span style=\"color:#953800;--shiki-dark:#FFA657\"> components</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> { </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">.card</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> { </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">display</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">grid</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> !important</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">; } }</span></span></code></pre></div>\n","options":[{"text":"none، لأن التصريحات المهمّة في الـ layers الأسبق تفوز.","why":"صحيح. مع <code dir=\"ltr\">!important</code> ينعكس ترتيب الـ layers، فتتغلّب <code dir=\"ltr\">reset</code> على <code dir=\"ltr\">components</code>."},{"text":"grid، لأن <code dir=\"ltr\">components</code> هي الـ layer اللاحقة.","why":"هذا صحيح في التصريحات العادية؛ أما المهمّة فتعكس الترتيب."},{"text":"grid، لأن الـ class يتغلّب على selector السمة.","why":"كلاهما درجته (0,1,0)، وعلى أيّ حال تُقارَن الـ layers قبل الـ specificity."},{"text":"القيمة الافتراضية للعنصر في المتصفّح.","why":"القاعدتان تنطبقان؛ والـ cascade يختار إحداهما."}],"answer":0},{"q":"<p><code dir=\"ltr\">--accent</code> غير معرّفة في أيّ مكان. ما الذي تُنتجه <code dir=\"ltr\">color: var(--accent, teal)</code>؟</p>","options":[{"text":"اللون الموروث، لأن التصريح غير صالح.","why":"القيمة البديلة موجودة لهذه الحالة بالذات؛ ولا يكون التصريح غير صالح إلا إن لم توجد قيمة بديلة قابلة للاستخدام."},{"text":"black، القيمة الابتدائية لـ color.","why":"حتى دون قيمة بديلة كانت <code dir=\"ltr\">color</code> سترث من العنصر الأب لا أن تعود إلى الأسود؛ وهنا تنطبق القيمة البديلة على أيّ حال."},{"text":"teal","why":"صحيح. الـ custom property غير المعرّفة تحمل القيمة غير الصالحة حتمًا، فتستخدم <code dir=\"ltr\">var()</code> قيمتها البديلة."},{"text":"سلسلة فارغة، فيصبح النص شفافًا.","why":"الـ custom properties لا تُنتج الشفافية من تلقاء نفسها؛ والقيمة البديلة هي التي تنطبق."}],"answer":2},{"q":"<p>شبكة من عمودين تستخدم <code dir=\"ltr\">grid-template-columns: 1fr 1fr</code>. مثال كود فيه سطر طويل جدًا يجعل العمود الأول أعرض بكثير. أيّ تغيير يُبقي العمودين متساويين ويتيح للكود أن يتمرّر؟</p>","options":[{"text":"<code dir=\"ltr\">grid-template-columns: repeat(2, auto)</code>","why":"الـ tracks بقيمة <code dir=\"ltr\">auto</code> تتحدّد بحسب المحتوى، فيزيد السطر الطويل الأمر سوءًا."},{"text":"<code dir=\"ltr\">grid-template-columns: minmax(0, 1fr) minmax(0, 1fr)</code> مع <code dir=\"ltr\">overflow-x: auto</code> على كتلة الكود.","why":"صحيح. إزالة الحدّ الأدنى التلقائي تُبقي الـ tracks متساوية؛ وكتلة الكود تعالج فيضانها بنفسها."},{"text":"<code dir=\"ltr\">white-space: nowrap</code> على كتلة الكود.","why":"هذا يمنع السطر من الالتفاف، وهو المشكلة أصلًا."},{"text":"<code dir=\"ltr\">grid-auto-flow: column</code>","why":"هذا يغيّر اتجاه وضع العناصر، لا أحجام الـ tracks."}],"answer":1},{"q":"<p>component يستخدم <code dir=\"ltr\">font-size: clamp(1rem, 4cqi, 2rem)</code>، لكنه في إحدى الصفحات ليس داخل أيّ حاوية حجم. إلامَ تُحسب <code dir=\"ltr\">4cqi</code> هناك؟</p>","options":[{"text":"4% من الحجم الأفقي للـ viewport الصغير، وهو البديل الاحتياطي لوحدات الحاوية.","why":"صحيح. في غياب حاوية مؤهّلة ترجع وحدات الحاوية إلى وحدات الـ viewport الصغيرة، فتظل القاعدة تعمل."},{"text":"صفر، فيستقرّ حجم الخط عند الحدّ الأدنى 1rem.","why":"وحدات الحاوية لا تُحسب صفرًا؛ بل ترجع إلى وحدات الـ viewport."},{"text":"عرض العنصر الأب.","why":"حاويات الحجم وحدها تُحسب؛ والعنصر الأب العادي لا يُقاس."},{"text":"التصريح غير صالح ويُتجاهل.","why":"القيمة صالحة؛ لكنها تستخدم بديل الـ viewport فحسب."}],"answer":0},{"q":"<p>أيّ تصريح يوسّط كتلة ثابتة العرض أفقيًا في الصفحات المكتوبة من اليسار إلى اليمين ومن اليمين إلى اليسار معًا؟</p>","options":[{"text":"<code dir=\"ltr\">margin-inline-start: auto;</code>","why":"جهة واحدة فقط تمتصّ المساحة، فتُدفع الكتلة إلى النهاية لا إلى المنتصف."},{"text":"<code dir=\"ltr\">text-align: center;</code>","why":"هذا يوسّط المحتوى الـ inline داخل الكتلة، لا الكتلة نفسها."},{"text":"<code dir=\"ltr\">inset-inline: 0;</code>","why":"خصائص الـ inset لا تؤثّر إلا في العناصر ذات التموضع، وهي تضبط المواضع لا margins التوسيط."},{"text":"<code dir=\"ltr\">margin-inline: auto;</code>","why":"صحيح. الـ margin في جهتي الـ inline كلتيهما تمتصّان المساحة الحرّة بالتساوي، أيًّا كان الاتجاه."}],"answer":3},{"q":"<p>ما الذي تُنتجه <code dir=\"ltr\">background: color-mix(in oklch, var(--brand), transparent 80%)</code>؟</p>","options":[{"text":"لون العلامة التجارية بعتامة 20%.","why":"صحيح. يأخذ transparent نسبة 80% من المزيج، فيحتفظ لون العلامة التجارية بـ 20% من قناة alpha الخاصة به."},{"text":"لون العلامة التجارية بعتامة 80%.","why":"الـ 80% تخصّ <code dir=\"ltr\">transparent</code>، اللون الذي تليه، فلا يحصل لون العلامة التجارية إلا على 20%."},{"text":"رمادي، لأن المزج مع transparent يزيل التشبّع.","why":"ليس لـ transparent درجة لون يجذب نحوها، فتُحفظ إضاءة لون العلامة التجارية وتشبّعه ودرجته."},{"text":"قيمة غير صالحة، لأن transparent لا يمكن مزجه.","why":"<code dir=\"ltr\">transparent</code> لون عادي في <code dir=\"ltr\">color-mix()</code>، وهو الطريقة المعتادة لإضافة الشفافية."}],"answer":0},{"q":"<p>الوضع الداكن لديك يبدّل كل token بشكل صحيح، لكن قوائم <code dir=\"ltr\">&lt;select&gt;</code> في النماذج وأشرطة التمرير تبقى بيضاء ساطعة. ما الناقص؟</p>","options":[{"text":"tokens داكنة لـ <code dir=\"ltr\">--select-bg</code> و<code dir=\"ltr\">--scrollbar-bg</code>.","why":"واجهة المتصفّح الأصلية لا تقرأ الـ custom properties الخاصة بك افتراضيًا."},{"text":"media query <code dir=\"ltr\">prefers-color-scheme</code> حول الـ tokens.","why":"هذا يغيّر الـ tokens لديك، وهي تعمل أصلًا؛ أما عناصر التحكّم الأصلية فما زالت تحتاج إلى <code dir=\"ltr\">color-scheme</code>."},{"text":"<code dir=\"ltr\">appearance: none</code> على كل عنصر تحكّم.","why":"هذا يرمي التنسيق الأصلي وميزات إمكانية الوصول لإصلاح شيء تعالجه خاصية واحدة."},{"text":"تصريح <code dir=\"ltr\">color-scheme</code> يتضمّن <code dir=\"ltr\">dark</code>، ليرسم المتصفّح واجهته الخاصة بالوضع الداكن.","why":"صحيح. عناصر التحكّم المدمجة وأشرطة التمرير تتبع <code dir=\"ltr\">color-scheme</code>، لا الـ custom properties الخاصة بك."}],"answer":3},{"q":"<p>مستخدم الفأرة ينقر زرًّا فلا يرى حلقة focus؛ ومستخدم لوحة المفاتيح يصل إليه بـ Tab فيرى حلقة. الـ CSS تستخدم <code dir=\"ltr\">:focus-visible</code>. هل هذا خطأ؟</p>","options":[{"text":"نعم. يجب أن تظهر الحلقة لكل مستخدم مع كل focus.","why":"تشترط WCAG مؤشّرًا ظاهرًا للتشغيل بلوحة المفاتيح، وهذا ما توفّره <code dir=\"ltr\">:focus-visible</code>."},{"text":"لا. <code dir=\"ltr\">:focus-visible</code> تستخدم قواعد المتصفّح التقديرية لتُظهر المؤشّر مع focus لوحة المفاتيح لا بعد نقرة فأرة على زر.","why":"صحيح. هذا هو السلوك المقصود، وهو يستوفي معيار Focus Visible لمستخدمي لوحة المفاتيح."},{"text":"نعم. الـ focus البرمجي مطلوب لمستخدمي الفأرة.","why":"مستخدمو الفأرة يرون أصلًا أين نقروا؛ ولا حاجة إلى focus برمجي."},{"text":"لا، لكن فقط لأن الزر بلا outline في ملف إعادة الضبط.","why":"ملف إعادة الضبط لا علاقة له بالأمر؛ قواعد <code dir=\"ltr\">:focus-visible</code> التقديرية هي ما يفسّر السلوك."}],"answer":1},{"q":"<p>نافذة حوار تُعرض بـ <code dir=\"ltr\">showModal()</code> يجب أن تظهر تدريجيًا من opacity صفر. الـ transition على <code dir=\"ltr\">opacity</code> لا يعمل أبدًا عند الفتح. ما الإصلاح؟</p>","options":[{"text":"زِد مدة الـ transition.","why":"الـ transition لا يبدأ أصلًا، فمدّته لا تهمّ."},{"text":"أضف <code dir=\"ltr\">@starting-style { dialog[open] { opacity: 0; } }</code> ليكون لأول نمط قيمة بداية.","why":"صحيح. دون حالة سابقة لا يوجد ما ينطلق منه الـ transition حين تُرسم نافذة الحوار أول مرة."},{"text":"استخدم <code dir=\"ltr\">animation-delay</code> بدل الـ transition.","why":"التأخير لا يعطي المتصفّح نمط بداية هو الآخر."},{"text":"اضبط <code dir=\"ltr\">will-change: opacity</code> على نافذة الحوار.","why":"<code dir=\"ltr\">will-change</code> تلميح للأداء ولا تُنشئ قيمة بداية."}],"answer":1},{"q":"<p>بطاقات المتحدّثين تظهر تدريجيًا بحركة مرتبطة بالتمرير داخل <code dir=\"ltr\">@supports (animation-timeline: view())</code>. ماذا يرى زائر يستخدم نسخة Firefox المستقرة في 2026؟</p>","options":[{"text":"البطاقات ظاهرة بالكامل، بلا حركة ظهور تدريجي.","why":"صحيح. كتلة <code dir=\"ltr\">@supports</code> لا تنطبق، فتحتفظ البطاقات بأنماطها العادية الظاهرة."},{"text":"بطاقات غير مرئية، لأن الظهور التدريجي يبدأ من opacity صفر.","why":"الـ keyframe ذو opacity صفر لا يُستخدم إلا داخل كتلة <code dir=\"ltr\">@supports</code> التي يتخطّاها Firefox."},{"text":"ظهورًا تدريجيًا زمنيًا عند تحميل الصفحة.","why":"لا شيء في الكتلة المحمية ينطبق، فلا حركة على الإطلاق."},{"text":"طبقة خطأ يعرضها المتصفّح.","why":"المتصفّحات تتخطّى بصمت الـ CSS التي لا تدعمها."}],"answer":0},{"q":"<p>خمسون بطاقة متحدّث تحرّك <code dir=\"ltr\">box-shadow</code> عند المرور، وتحريك الفأرة عبر الشبكة يبدو ثقيلًا. ما الطريقة الأرخص للحصول على المظهر نفسه؟</p>","options":[{"text":"أضف <code dir=\"ltr\">will-change: box-shadow</code> إلى كل بطاقة.","why":"رفع الطبقة لا يمنع الظلّ من إعادة الرسم في كل إطار، وخمسون طبقة تكلّف ذاكرة."},{"text":"قلّل مدة الـ transition إلى 50ms.","why":"إطارات أقل من إعادة الرسم تظل إعادة رسم، ويصبح التأثير مفاجئًا."},{"text":"ضع الظلّ الأكبر على pseudo-element <code dir=\"ltr\">::after</code> وحرّك الـ <code dir=\"ltr\">opacity</code> الخاصة به بدلًا من ذلك.","why":"صحيح. يُرسم الظلّ مرة واحدة؛ والمرور لا يغيّر إلا التركيب، فلا تعمل إعادة رسم في كل إطار."},{"text":"استخدم <code dir=\"ltr\">filter: drop-shadow()</code> بدلًا منها.","why":"تغيير ظلّ الـ filter يظل يتطلّب إعادة رسم العنصر المرشَّح في كل إطار."}],"answer":2}],"glossary":[{"id":"cascade","term":"Cascade","definition":"الخوارزمية التي يستخدمها المتصفّح لاختيار قيمة واحدة حين تستهدف عدّة تصريحات الخاصية نفسها على العنصر نفسه: المصدر والأهمية، ثم الأنماط المضمّنة، ثم الـ layers، ثم الـ specificity، ثم ترتيب الظهور.","lesson":"l-css-1-1"},{"id":"inheritance","term":"الوراثة (Inheritance)","definition":"حين لا يستهدف أيّ تصريح خاصيةً موروثة مثل <code dir=\"ltr\">color</code> أو <code dir=\"ltr\">font-family</code>، يأخذ العنصر القيمة المحسوبة لعنصره الأب؛ أما الخصائص غير الموروثة فترجع إلى قيمتها الابتدائية.","lesson":"l-css-1-1"},{"id":"specificity","term":"Specificity","definition":"وزن الـ selector، ويُحسب ثلاثة أعداد منفصلة (الـ IDs؛ ثم الـ classes والسمات والـ pseudo-classes؛ ثم الأنواع والـ pseudo-elements) تُقارَن عمودًا بعمود، ولا تُجمع معًا أبدًا.","lesson":"l-css-1-2"},{"id":"where-pseudo-class","term":":where()","definition":"pseudo-class تطابق كما تطابق <code dir=\"ltr\">:is()</code> لكن الـ specificity فيها صفر دائمًا، ما يجعلها مثالية لأنماط إعادة الضبط والأنماط الأساسية التي يجب أن تتجاوزها الـ components بسهولة.","lesson":"l-css-1-2"},{"id":"is-pseudo-class","term":":is()","definition":"pseudo-class تطابق أيّ selector في قائمتها وتأخذ specificity أدقّ وسيط فيها؛ وتستخدم قائمة selectors متسامحة، فلا يُسقط وسيط واحد غير صالح القاعدة كلها.","lesson":"l-css-1-2"},{"id":"cascade-layer","term":"طبقة الـ cascade (Cascade layer)","definition":"مجموعة مسمّاة من القواعد تُنشأ بـ <code dir=\"ltr\">@layer</code>. الـ layers المُعلنة لاحقًا تتغلّب على السابقة قبل مقارنة الـ specificity، والأنماط خارج الـ layers تتغلّب على كل الـ layers في التصريحات العادية.","lesson":"l-css-1-3"},{"id":"custom-property","term":"Custom property","definition":"خاصية يبدأ اسمها بشرطتين، مثل <code dir=\"ltr\">--track-color</code>، وتُقرأ بـ <code dir=\"ltr\">var()</code>. وهي موروثة افتراضيًا، وتُستبدل حيث تُستخدم، في وقت حساب القيمة.","lesson":"l-css-1-4"},{"id":"invalid-at-computed-value-time","term":"غير صالح في وقت حساب القيمة (Invalid at computed-value time)","definition":"ما يحدث حين يُنتج الاستبدال في <code dir=\"ltr\">var()</code> قيمة لا تستطيع الخاصية استخدامها: تتصرّف الخاصية كأنها غير مضبوطة، فتأخذ قيمتها الموروثة أو الابتدائية بدل تصريح سابق.","lesson":"l-css-1-4"},{"id":"at-property","term":"@property","definition":"قاعدة at-rule تسجّل custom property بصيغة وعلامة للوراثة وقيمة ابتدائية، فيستطيع المتصفّح فحص صحّتها والانتقال بين قيمها تدريجيًا في الـ transitions والحركات.","lesson":"l-css-1-4"},{"id":"css-nesting","term":"CSS nesting","definition":"صيغة أصلية لكتابة القواعد داخل قواعد أخرى، حيث تمثّل <code dir=\"ltr\">&amp;</code> الـ selector الأب. وهي تعمل على الـ selectors لا على النص، فلا تستطيع بناء أسماء classes على طريقة BEM كما يفعل Sass.","lesson":"l-css-1-5"},{"id":"has-pseudo-class","term":":has()","definition":"pseudo-class علائقية تطابق العنصر حين يجد الـ selector النسبي بداخلها تطابقًا، فتتيح تنسيق عنصر أب أو شقيق سابق بحسب أبنائه أو أشقّائه اللاحقين.","lesson":"l-css-1-5"},{"id":"flex-basis","term":"flex-basis","definition":"الحجم الذي يبدأ منه عنصر flex على امتداد المحور الرئيسي، قبل أن تتقاسم <code dir=\"ltr\">flex-grow</code> المساحة المتبقية أو تستردّ <code dir=\"ltr\">flex-shrink</code> النقص.","lesson":"l-css-2-1"},{"id":"automatic-minimum-size","term":"الحجم الأدنى التلقائي (Automatic minimum size)","definition":"القيمة الافتراضية <code dir=\"ltr\">min-width: auto</code> لعناصر flex وgrid، التي تمنعها من التقلّص تحت حجم محتواها. وضبط <code dir=\"ltr\">min-width: 0</code> يتيح للنص الطويل أن يُقتطع بدل أن يفيض.","lesson":"l-css-2-1"},{"id":"grid-template-areas","term":"grid-template-areas","definition":"خاصية grid تسمّي مناطق الشبكة بسلاسل نصية، سلسلة لكل صف، فتستطيع وضع العناصر بأسمائها وإعادة ترتيب التخطيط بإعادة رسم السلاسل.","lesson":"l-css-2-2"},{"id":"auto-fit","term":"auto-fit","definition":"كلمة مفتاحية لـ <code dir=\"ltr\">repeat()</code> تنشئ أكبر عدد من الـ tracks يتّسع وتطوي الفارغة منها، فتتمدّد العناصر القليلة لتملأ الصف؛ أما <code dir=\"ltr\">auto-fill</code> فتحتفظ بالـ tracks الفارغة.","lesson":"l-css-2-2"},{"id":"subgrid","term":"Subgrid","definition":"القيمة <code dir=\"ltr\">subgrid</code> لـ <code dir=\"ltr\">grid-template-rows</code> أو <code dir=\"ltr\">grid-template-columns</code>، التي تجعل الشبكة المتداخلة تستخدم tracks الأب التي تمتدّ عليها، فيصطفّ المحتوى عبر الـ components الشقيقة.","lesson":"l-css-2-3"},{"id":"fit-content","term":"fit-content","definition":"كلمة مفتاحية للتحجيم الذاتي تجعل حجم العنصر بعرض max-content الخاص به، محدودًا بالمساحة المتاحة، فتستطيع الكتلة أن تحتضن محتواها دون أن تفيض.","lesson":"l-css-2-4"},{"id":"clamp","term":"clamp()","definition":"دالة رياضية تُرجع قيمة مفضّلة محصورة بين حدّ أدنى وحدّ أقصى، وتُكتب <code dir=\"ltr\">clamp(MIN, PREFERRED, MAX)</code>. وهي تساوي <code dir=\"ltr\">max(MIN, min(PREFERRED, MAX))</code>.","lesson":"l-css-2-4"},{"id":"container-query","term":"Container query","definition":"قاعدة <code dir=\"ltr\">@container</code> تطبّق الأنماط بحسب حجم حاوية من الأسلاف أو نمطها بدل الـ viewport، فيتكيّف الـ component مع الخانة التي يجلس فيها.","lesson":"l-css-2-5"},{"id":"container-units","term":"وحدات الحاوية (Container query units)","definition":"وحدات مثل <code dir=\"ltr\">cqi</code> و<code dir=\"ltr\">cqb</code> تساوي 1% من الحجم الأفقي أو الرأسي لأقرب حاوية حجم، وترجع إلى وحدات الـ viewport الصغيرة حين لا توجد حاوية.","lesson":"l-css-2-5"},{"id":"fluid-type","term":"الخطوط المرنة (Fluid type)","definition":"أحجام خطوط تتغيّر باستمرار مع العرض المتاح، وتُكتب عادةً بـ <code dir=\"ltr\">clamp()</code> مع حدّ أدنى بـ rem، وقيمة مفضّلة خطية تجمع rem مع <code dir=\"ltr\">vw</code> أو <code dir=\"ltr\">cqi</code>، وحدّ أقصى بـ rem.","lesson":"l-css-3-1"},{"id":"logical-properties","term":"الخصائص المنطقية (Logical properties)","definition":"خصائص مسمّاة بحسب سير النص لا بحسب الجهات الفيزيائية، مثل <code dir=\"ltr\">margin-inline-start</code> و<code dir=\"ltr\">inline-size</code>، فتنعكس التخطيطات بشكل صحيح في اللغات التي تُكتب من اليمين إلى اليسار مثل العربية.","lesson":"l-css-3-2"},{"id":"oklch","term":"oklch()","definition":"دالة ألوان تستخدم الإضاءة والتشبّع ودرجة اللون الإدراكية، فتبدو الألوان المتساوية في الإضاءة متساوية في السطوع. وتستطيع أيضًا التعبير عن ألوان خارج نطاق sRGB.","lesson":"l-css-3-3"},{"id":"relative-color-syntax","term":"صيغة الألوان النسبية (Relative color syntax)","definition":"طريقة لاشتقاق لون من آخر بفكّ قنواته باستخدام <code dir=\"ltr\">from</code>، كما في <code dir=\"ltr\">oklch(from var(--brand) calc(l - 0.1) c h)</code>، وتغيير ما تحتاج إليه فقط.","lesson":"l-css-3-3"},{"id":"light-dark","term":"light-dark()","definition":"دالة ألوان تُرجع قيمتها الأولى حين يكون النظام اللوني المستخدم في العنصر فاتحًا، والثانية حين يكون داكنًا. وتحتاج إلى أن تسمح <code dir=\"ltr\">color-scheme</code> بالداكن.","lesson":"l-css-3-4"},{"id":"focus-visible","term":":focus-visible","definition":"pseudo-class تطابق العنصر الذي عليه الـ focus فقط حين يرى المتصفّح أن مؤشّر الـ focus مفيد، مثل focus لوحة المفاتيح أو أيّ حقل نصي، لا عند نقرة فأرة على زر.","lesson":"l-css-3-5"},{"id":"starting-style","term":"@starting-style","definition":"قاعدة at-rule تحدّد الأنماط التي ينطلق منها العنصر في الـ transition حين يُرسم أول مرة أو ينتقل من <code dir=\"ltr\">display: none</code> إلى الظهور، فتتيح حركات الدخول بـ CSS وحدها.","lesson":"l-css-4-1"},{"id":"view-transition","term":"View transition","definition":"حركة تُنشئها <code dir=\"ltr\">document.startViewTransition()</code>: يلتقط المتصفّح صورتين للحالتين القديمة والجديدة في تحديث الـ DOM، ويحرّك الانتقال بينهما عبر pseudo-elements تستطيع تنسيقها.","lesson":"l-css-4-2"},{"id":"scroll-driven-animation","term":"الحركة المرتبطة بالتمرير (Scroll-driven animation)","definition":"حركة CSS يتبع تقدّمها خط زمن للتمرير، يُضبط بـ <code dir=\"ltr\">animation-timeline: scroll()</code> أو <code dir=\"ltr\">view()</code>، بدل الزمن المنقضي.","lesson":"l-css-4-3"},{"id":"compositing","term":"التركيب (Compositing)","definition":"المرحلة الأخيرة من الرسم، حيث تُجمَّع الطبقات المرسومة على الـ GPU. وكثيرًا ما يمكن معالجة تغييرات <code dir=\"ltr\">transform</code> و<code dir=\"ltr\">opacity</code> هنا وحدها، بتخطّي التخطيط والرسم.","lesson":"l-css-4-5"}]}