{"id":"l-fig-3-4","courseId":"figma-ui-design","lang":"ar","kind":"lesson","summary":"أضف الـ modes ‏Light وDark إلى الـ variables الدلالية في Steady، وبدّل شاشات كاملة بينهما، وأعِد فحص التباين لكي يكون الوضع الداكن مصمّمًا لا مقلوبًا.","html":"<p>أسرع طريقة لصنع الوضع الداكن أن تكرّر كل شاشة وتعيد تلوينها يدويًا. وهي أيضًا أسرع طريقة للحصول على مجموعتين من الشاشات تختلفان خلال شهر: يضيف أحدهم صف عادة إلى شاشة Today الفاتحة وينسى الداكنة. في Steady سيكون الوضع الداكن مفتاحًا واحدًا على الـ frame، لأن الألوان تشير إلى معانٍ أصلًا.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">الـ Modes أعمدة من القيم</h2>\n<p>افتح الـ variables المحلية (تصل إليها من الشريط الجانبي الأيمن دون تحديد أي شيء، وقت كتابة هذا الدرس) وانظر إلى الـ collection المسمّاة <code dir=\"ltr\">Semantic</code>. فيها عمود واحد من القيم، اسمه <code dir=\"ltr\">Mode 1</code> افتراضيًا. أعِد تسميته إلى <code dir=\"ltr\">Light</code>، ثم أضف mode وسمّه <code dir=\"ltr\">Dark</code>. صار لكل variable قيمتان: واحدة لكل عمود. ينسخ Figma القيم الموجودة إلى العمود الجديد، وهذه نقطة بداية لا إجابة.</p>\n<p>املأ عمود Dark بجعل كل variable ‏alias لـ primitives مختلفة. هذا جدول الربط في Steady، مع قياس التباين مقابل السطح الذي يقع عليه كل لون:</p>\n<div class=\"table-wrap\" role=\"region\" aria-label=\"جدول قابل للتمرير\" tabindex=\"0\"><table><thead>\n<tr>\n<th>الـ variable الدلالي</th>\n<th>Light</th>\n<th>Dark</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code dir=\"ltr\">color/surface/default</code></td>\n<td>white</td>\n<td>gray/950 ‏(#111827)</td>\n</tr>\n<tr>\n<td><code dir=\"ltr\">color/surface/raised</code></td>\n<td>white</td>\n<td>gray/800 ‏(#1F2937)</td>\n</tr>\n<tr>\n<td><code dir=\"ltr\">color/text/primary</code></td>\n<td>gray/900، ‏17.40:1</td>\n<td>gray/50، ‏16.98:1</td>\n</tr>\n<tr>\n<td><code dir=\"ltr\">color/text/secondary</code></td>\n<td>gray/500، ‏4.83:1</td>\n<td>gray/400، ‏6.99:1</td>\n</tr>\n<tr>\n<td><code dir=\"ltr\">color/action/primary</code></td>\n<td>teal/700، ‏5.47:1</td>\n<td>teal/400، ‏9.53:1</td>\n</tr>\n<tr>\n<td><code dir=\"ltr\">color/on-action</code></td>\n<td>white</td>\n<td>gray/950</td>\n</tr>\n</tbody>\n</table></div><p>أبقِ الـ collection المسمّاة <code dir=\"ltr\">Primitives</code> بـ mode واحد. الـ primitive حقيقة (<code dir=\"ltr\">teal/700</code> هو #0F766E)؛ أما الـ variable الدلالي فقرار يعتمد على السياق. والـ modes تخصّ القرارات.</p>\n<figure class=\"diagram\"><svg class=\"diagram-svg\" focusable=\"false\" viewBox=\"0 0 680 230\" role=\"img\" aria-labelledby=\"l-fig-3-4-t1\"><defs><marker id=\"arrow-l-fig-3-4-1\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\"><path d=\"M0 0 L10 5 L0 10 z\" class=\"d-arrowhead\"/></marker></defs>\n  <title id=\"l-fig-3-4-t1\">الـ variable الدلالي action primary في المنتصف. في الـ mode ‏Light يشير إلى teal 700؛ وفي Dark يشير إلى teal 400. زر التعليم المرتبط به يظهر بتركوازي داكن على شاشة فاتحة وبتركوازي فاتح على شاشة داكنة.</title>\n  <rect class=\"d-box\" x=\"20\" y=\"40\" width=\"150\" height=\"44\" rx=\"8\"/>\n  <text class=\"d-code\" x=\"95\" y=\"67\" text-anchor=\"middle\">teal/700</text>\n  <rect class=\"d-box\" x=\"20\" y=\"140\" width=\"150\" height=\"44\" rx=\"8\"/>\n  <text class=\"d-code\" x=\"95\" y=\"167\" text-anchor=\"middle\">teal/400</text>\n  <rect class=\"d-box-primary\" x=\"250\" y=\"88\" width=\"180\" height=\"48\" rx=\"10\"/>\n  <text class=\"d-code\" x=\"340\" y=\"117\" text-anchor=\"middle\">action/primary</text>\n  <path class=\"d-arrow\" d=\"M248 104 L172 66\" marker-end=\"url(#arrow-l-fig-3-4-1)\"/>\n  <path class=\"d-arrow\" d=\"M248 122 L172 160\" marker-end=\"url(#arrow-l-fig-3-4-1)\"/>\n  <text class=\"d-label-muted\" x=\"205\" y=\"72\" text-anchor=\"middle\">Light</text>\n  <text class=\"d-label-muted\" x=\"205\" y=\"164\" text-anchor=\"middle\">Dark</text>\n  <rect class=\"d-box\" x=\"500\" y=\"30\" width=\"160\" height=\"70\" rx=\"12\"/>\n  <circle class=\"d-dot\" cx=\"530\" cy=\"65\" r=\"12\"/>\n  <text class=\"d-label\" x=\"552\" y=\"70\">صف فاتح</text>\n  <rect class=\"d-box-accent\" x=\"500\" y=\"126\" width=\"160\" height=\"70\" rx=\"12\"/>\n  <circle class=\"d-dot\" cx=\"530\" cy=\"161\" r=\"12\"/>\n  <text class=\"d-label\" x=\"552\" y=\"166\">صف داكن</text>\n  <path class=\"d-arrow\" d=\"M432 104 L498 70\" marker-end=\"url(#arrow-l-fig-3-4-1)\"/>\n  <path class=\"d-arrow\" d=\"M432 120 L498 156\" marker-end=\"url(#arrow-l-fig-3-4-1)\"/>\n</svg><figcaption>الـ variable الدلالي نفسه يُحلّ إلى primitives مختلفة حسب الـ mode</figcaption></figure>\n<h2 id=\"sec-2\" tabindex=\"-1\">تبديل شاشة</h2>\n<p>كرّر frame شاشة Today وحدّد النسخة. في الشريط الجانبي الأيمن، استخدم عنصر التحكم في mode الـ variables (في قسم Appearance وقت كتابة هذا الدرس)، واختر الـ collection المسمّاة <code dir=\"ltr\">Semantic</code> ثم <code dir=\"ltr\">Dark</code>. تتبدّل كل تعبئة وحدّ ولون نص مرتبط في الشاشة دفعة واحدة.</p>\n<p>ينجح ذلك بفضل الوراثة. كل طبقة تبدأ على <strong>Auto</strong>، أي «استخدم الـ mode الخاص بأبي». يصعد Figma في شجرة الطبقات حتى يجد أبًا ضُبط له mode، وإن لم يجد، يستخدم الـ mode الافتراضي للـ collection (العمود الأول). ويمكنك أيضًا ضبط mode على صفحة كاملة دون تحديد أي شيء.</p>\n<p>الآن لم تعد النسخة شيئًا تصونه؛ إنها الـ components نفسها معروضة عبر mode مختلف. أضف صف عادة إلى الشاشة الفاتحة وانسخه إلى الداكنة، وسيكون داكنًا من فوره.</p>\n<aside class=\"callout callout-note\" role=\"note\"><p class=\"callout-title\"><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\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 16v-4\"/><path d=\"M12 8h.01\"/></svg><span><span class=\"callout-kind\">ملاحظة</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>توفّر الميزة حسب الخطة</span></p>\n<p>وقت كتابة هذا الدرس، لا تتضمّن خطة Starter المجانية الـ modes في الـ variables؛ وتسمح خطة Professional بما يصل إلى 10 modes لكل collection، وخطة Organization بما يصل إلى 20. إن كنت على Starter، فابنِ عمود Dark كـ collection ثانية لترى القيم جنبًا إلى جنب، وتابع طريقة التفكير.</p>\n</aside>\n<h2 id=\"sec-3\" tabindex=\"-1\">صمّم الوضع الداكن ولا تقلبه</h2>\n<p>الوضع الداكن تصميم قائم بذاته. وبضع قواعد تكفي لمعظم العمل:</p>\n<ul>\n<li><strong>الألوان المميّزة تصبح أفتح.</strong> ‏teal/700 يعطي 5.47:1 على الأبيض لكن 3.24:1 فقط على gray/950. يجب أن يكون اللون المميّز في الوضع الداكن درجة أفتح.</li>\n<li><strong>النص فوق الألوان المميّزة قد ينقلب.</strong> الأبيض على teal/400 يعطي 1.86:1، وهذا فشل واضح. لهذا السبب يوجد <code dir=\"ltr\">color/on-action</code> كـ token مستقل: في Dark يشير إلى gray/950، فيعطي 9.53:1.</li>\n<li><strong>الارتفاع يعني لونًا أفتح، لا أغمق.</strong> الظلال بالكاد تظهر على الخلفيات الداكنة، لذا تستخدم الأسطح المرتفعة مثل لوحة New habit رماديًا أفتح قليلًا (<code dir=\"ltr\">surface/raised</code>).</li>\n<li><strong>تجنّب التطرّف الحادّ.</strong> النص القريب من الأبيض على خلفية قريبة من الأسود أريح في الجلسات الطويلة من الأبيض الصافي على الأسود الصافي، الذي قد يبهر العين.</li>\n</ul>\n<aside class=\"callout callout-mistake\" role=\"note\"><p class=\"callout-title\"><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\"><path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg><span><span class=\"callout-kind\">خطأ شائع</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>الثقة بفحوص التباين في الوضع الفاتح</span></p>\n<p>كل زوج قسته في الدرس 1.3 قِيس على الأبيض. في الوضع الداكن تغيّرت الخلفيات، فتغيّرت الأرقام. بدّل كل شاشة إلى Dark وأعِد تشغيل أداة فحص التباين في Figma على النصوص والأيقونات وحدود عناصر التحكم. الأزواج التي تنجح في mode كثيرًا ما تفشل في الآخر.</p>\n</aside>\n<h2 id=\"sec-4\" tabindex=\"-1\">الـ Modes أبعد من الألوان</h2>\n<p>الـ modes ليست للثيمات فقط. collection باسم <code dir=\"ltr\">Density</code> فيها الـ modes ‏<code dir=\"ltr\">Comfortable</code> و<code dir=\"ltr\">Compact</code> يمكن أن تحمل number variables للـ padding في الصف (12 مقابل 8) وللـ gap بين الصفوف. وcollection باسم <code dir=\"ltr\">Content</code> فيها string variables يمكن أن تحمل التسميات نفسها بالإنجليزية والعربية، وهذه طريقة سريعة لترى هل ما زال “Save habit” يتّسع حين يصبح أطول. بل يمكنك تبديل الـ modes داخل prototype، مثلًا لعرض مفتاح الثيم الداكن في الإعدادات.</p>\n<p>صارت لديك الآن مجموعة بثيمات ومبنية على tokens. الدرس الأخير من هذا القسم ينظّمها في شيء يستطيع مصمّم آخر، أو مطوّر، أن يتسلّمه ويستخدمه دون أن يسألك.</p>\n","toc":[{"id":"sec-1","text":"الـ Modes أعمدة من القيم","level":2},{"id":"sec-2","text":"تبديل شاشة","level":2},{"id":"sec-3","text":"صمّم الوضع الداكن ولا تقلبه","level":2},{"id":"sec-4","text":"الـ Modes أبعد من الألوان","level":2}],"takeaways":["الـ mode عمود واحد من القيم في collection من الـ variables؛ وتبديل الـ mode في frame يستبدل كل قيمة مرتبطة دفعة واحدة.","ضع الـ modes على الـ collection الدلالية وأبقِ الـ primitives بـ mode واحد، فلا يغيّر الوضع الداكن إلا ما يشير إليه كل معنى.","تستخدم الطبقات الـ mode ‏Auto افتراضيًا، فترث من أقرب أب ضُبط له mode، وإلا تعود إلى الـ mode الافتراضي للـ collection.","الوضع الداكن ليس قلبًا للألوان؛ الألوان المميّزة تصبح عادةً أفتح، والنص فوقها قد ينقلب إلى داكن، والأسطح تصبح أفتح كلما ارتفعت.","كل لون نص وعنصر تحكم يحتاج فحص تباين جديدًا في كل mode، لأن زوجًا ينجح في الفاتح قد يفشل في الداكن."],"further":[{"title":"Modes for variables","url":"https://help.figma.com/hc/en-us/articles/15343816063383-Modes-for-variables"},{"title":"Variable modes in prototypes","url":"https://help.figma.com/hc/en-us/articles/15253268379799-Variable-modes-in-prototypes"},{"title":"Dark Mode (Apple Human Interface Guidelines)","url":"https://developer.apple.com/design/human-interface-guidelines/dark-mode"}],"quiz":[{"q":"<p>تضبط frame شاشة Today على Dark. صف عادة واحد داخله مضبوط صراحةً على Light. ماذا ترى؟</p>","options":[{"text":"الشاشة كلها داكنة، وذلك الصف وحده يُعرض بقيم Light.","why":"صحيح. الطبقات ترث من أقرب أب ضُبط له mode. والـ mode الصريح على الصف يتغلّب على mode الـ frame لذلك الصف وأبنائه."},{"text":"الشاشة كلها بما فيها الصف داكنة، لأن mode الـ frame يفوز دائمًا.","why":"الـ mode الصريح الأقرب هو الذي يفوز، لا الأبعد."},{"text":"يعرض Figma خطأً لأن الـ modes متعارضة.","why":"خلط الـ modes مسموح ومفيد، مثل بطاقة فاتحة داخل منطقة ترويجية داكنة."},{"text":"يصبح الصف فاتحًا، ومعه بقية الشاشة.","why":"الـ mode في الابن لا يغيّر الـ mode في أبيه أبدًا."}],"answer":0},{"q":"<p>في الوضع الداكن، يشير <code dir=\"ltr\">color/action/primary</code> إلى teal/400 ‏(#2DD4BF)، وتسمية الزر تستخدم <code dir=\"ltr\">color/on-action</code> الذي ما زال أبيض. تباين التسمية 1.86:1. ما الإصلاح الصحيح؟</p>","options":[{"text":"إعادة توجيه action/primary إلى teal/700 في الوضع الداكن.","why":"‏teal/700 على السطح الداكن يعطي 3.24:1 فقط، فستفقد أزرار التعليم التباين بدلًا من ذلك."},{"text":"إضافة ظل للنص في الوضع الداكن.","why":"الظلال لا تُحسب في التباين وتطمس النص."},{"text":"توجيه قيمة on-action في Dark إلى لون قريب من الأسود مثل gray/950، فيعطي 9.53:1 على teal/400.","why":"صحيح. لهذا السبب on-action ‏token دلالي مستقل. يمكن لقيمته أن تنقلب من الأبيض إلى الداكن حسب الـ mode."},{"text":"جعل التسمية بخط عريض لتُعدّ نصًا كبيرًا.","why":"حتى النص الكبير يحتاج 3:1، و1.86:1 تفشل في ذلك أيضًا."}],"answer":2},{"q":"<p>لماذا تبقى الـ primitives ‏(teal/700، gray/500…) في collection بـ mode واحد؟</p>","options":[{"text":"لأن Figma لا يسمح بالـ modes في collections فيها أكثر من 20 variable.","why":"لا يوجد حدّ كهذا. الاختيار معماري."},{"text":"لأن الـ primitives حقائق خام عن لوحة الألوان، والمعاني تتغيّر حسب الـ mode بأن تكون aliases لـ primitives مختلفة.","why":"صحيح. لو تغيّر teal/700 حسب الـ mode لما بقي teal/700، ولأصبح كل alias غير متوقّع."},{"text":"لأن الـ primitives لا يمكن أن تكون هدفًا لـ alias إذا كانت لها modes.","why":"الـ variables التي لها modes يمكن مع ذلك أن تكون هدفًا لـ alias. السبب الوضوح، لا قاعدة تقنية."},{"text":"لأن Dev Mode لا يقرأ إلا الـ collections ذات الـ mode الواحد.","why":"يعرض Dev Mode الـ variables من أي collection، بما في ذلك الـ modes الخاصة بها."}],"answer":1}],"exercise":{"kind":"choice","multiple":true,"options":["lighter-accent","flip-on-action","border-dark","secondary-white","duplicate-recolor","mode-primitives"],"correct":["lighter-accent","flip-on-action","border-dark"],"title":"راجع المحاولة الأولى للوضع الداكن","prompt":"<p>أضاف زميلك mode باسم Dark إلى الـ collection الدلالية في Steady، لكنه لم يغيّر إلا قيم الأسطح والنصوص. هذا ما تُحلّ إليه شاشة Today في Dark، مقيسًا مقابل <code dir=\"ltr\">surface/default</code> ‏(#111827) ما لم يُذكر غير ذلك:</p>\n<div class=\"table-wrap\" role=\"region\" aria-label=\"جدول قابل للتمرير\" tabindex=\"0\"><table><thead>\n<tr>\n<th>الـ Variable</th>\n<th>القيمة في Dark</th>\n<th>النتيجة</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code dir=\"ltr\">text/primary</code></td>\n<td>gray/50</td>\n<td>16.98:1</td>\n</tr>\n<tr>\n<td><code dir=\"ltr\">text/secondary</code></td>\n<td>gray/400</td>\n<td>6.99:1</td>\n</tr>\n<tr>\n<td><code dir=\"ltr\">action/primary</code></td>\n<td>teal/700 (دون تغيير)</td>\n<td>3.24:1، أيقونات التعليم والروابط تبدو باهتة</td>\n</tr>\n<tr>\n<td><code dir=\"ltr\">on-action</code></td>\n<td>white (دون تغيير)</td>\n<td>5.47:1 على teal/700</td>\n</tr>\n<tr>\n<td><code dir=\"ltr\">border/default</code></td>\n<td>gray/200 (دون تغيير)</td>\n<td>14.33:1، الفواصل تبهر العين</td>\n</tr>\n</tbody>\n</table></div><p>اختر <strong>كل</strong> تغيير يحسّن الوضع الداكن دون أن يكسر شيئًا آخر.</p>\n","hints":["الروابط وأيقونات التعليم الصغيرة تشبه النص. هل 3.24:1 كافية لها؟","إذا فتّحت اللون المميّز، فافحص ما يحدث للتسمية البيضاء التي تقع فوقه.","الفواصل زخرفة؛ يجب أن تكون مرئية لكن هادئة. وخط قريب من الأبيض على خلفية قريبة من الأسود ليس هذا ولا ذاك."],"explanation":"<p>وجّه <code dir=\"ltr\">action/primary</code> إلى <strong>تركوازي أفتح</strong> مثل teal/400 ‏(9.53:1 على gray/950)، لأن الروابط والأيقونات الصغيرة تحتاج تباينًا بمستوى النص. هذا يجعل التسميات البيضاء فوق اللون المميّز تفشل (1.86:1)، لذا <strong>اقلب <code dir=\"ltr\">on-action</code> إلى رمادي داكن</strong> مثل gray/950 ‏(9.53:1) في Dark. ووجّه <code dir=\"ltr\">border/default</code> إلى <strong>رمادي أغمق</strong> حتى تفصل الفواصل بين الصفوف دون أن تبهر العين؛ واحتفظ بـ token منفصل لحدود عناصر التحكم يحقّق 3:1 لخانات الاختيار. أما جعل النص الثانوي أبيض فيمحو التسلسل البصري للنص، وإعادة تلوين frame مكرّر يدويًا تُفشل الغاية من الـ modes كلها، والـ primitives يجب أن تبقى حقائق بـ mode واحد تختار بينها الطبقة الدلالية.</p>\n","checkLabels":{},"optionText":{"lighter-accent":{"text":"وجّه قيمة action/primary في Dark إلى تركوازي أفتح مثل teal/400.","why":"صحيح. ‏teal/700 يعطي 3.24:1 فقط على السطح الداكن؛ أما teal/400 فيعطي 9.53:1 ويحافظ على درجة لون العلامة التجارية."},"flip-on-action":{"text":"وجّه قيمة on-action في Dark إلى gray/950 لتبقى التسميات فوق التركوازي الأفتح مقروءة.","why":"صحيح. الأبيض على teal/400 يعطي 1.86:1. والنص الداكن عليه يعطي 9.53:1، ولهذا بالضبط on-action ‏token مستقل."},"border-dark":{"text":"وجّه قيمة border/default في Dark إلى رمادي أغمق لتكون الفواصل هادئة.","why":"صحيح. فاصل زخرفي بتباين 14:1 يصرخ. الرمادي الخفيف يفصل الصفوف؛ أما حدود عناصر التحكم التي يجب أن تحقّق 3:1 فلها token خاص بها."},"secondary-white":{"text":"اجعل text/secondary أبيض في Dark ليحصل كل النص على أعلى تباين.","why":"النص الثانوي ينجح بالفعل بنسبة 6.99:1. جعله أبيض يسطّح التسلسل البصري بين الأسماء والـ streaks."},"duplicate-recolor":{"text":"كرّر frame شاشة Today وأعِد تلوين النسخة يدويًا للوضع الداكن.","why":"النسخ المعاد تلوينها يدويًا تنحرف عن الشاشة الحقيقية فورًا. الـ modes موجودة لتخدم شاشة واحدة الثيمين معًا."},"mode-primitives":{"text":"أضف mode باسم Dark إلى الـ collection المسمّاة Primitives وفتّح teal/700 هناك.","why":"عندها لن يعني teal/700 اللون #0F766E بعد الآن، وسيتغيّر كل alias يستخدمه بشكل غير متوقّع. الـ modes مكانها الطبقة الدلالية."}}},"words":652,"readMinutes":4}