{"id":"l-fig-2-3","courseId":"figma-ui-design","lang":"ar","kind":"lesson","summary":"أضف Layout guides من نوع Columns إلى شاشات Steady، واعتمد سلّم مسافات من مضاعفات 8 مع نصف خطوة بمقدار 4، واستخدمهما لتجعل كل gap وpadding وحجم قرارًا تستطيع تسميته.","html":"<p>اطلب من ثلاثة مصمّمين ضبط المسافات في بطاقة العادة نفسها، وستحصل على padding بمقدار 14 و15 و16 px. لا أحد منهم مخطئ بمفرده. لكن معًا، عبر أربعين شاشة، يصنعون تطبيقًا يبدو غير ثابت قليلًا، المقابل البصري لطاولة إحدى أرجلها أقصر.</p>\n<p>أداتان تمنعان ذلك. الـ Layout guides تعطي كل شاشة الهيكل نفسه لتحاذي عليه، ونظام المسافات يحصر الأرقام المسموح لك باستخدامها.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">الـ Layout guides</h2>\n<p>وقت كتابة هذا الدرس، يسمّيها Figma ‏<strong>layout guides</strong>؛ والشروحات القديمة تسمّيها layout grids. إنها أدوات بصرية مساعدة مرتبطة بالـ frame: تراها أثناء التصميم، ولا تظهر أبدًا في الملفات المُصدَّرة، ولا تحرّك شيئًا من تلقاء نفسها. حدّد frame وأضف واحدًا من قسم الـ Layout guide في الشريط الجانبي الأيمن.</p>\n<p>هناك ثلاثة أنواع:</p>\n<ul>\n<li><strong>Columns</strong> (أعمدة): أشرطة عمودية تمتدّ على ارتفاع الـ frame. الأداة الأساسية لتخطيط الشاشات.</li>\n<li><strong>Rows</strong> (صفوف): أشرطة أفقية، مفيدة لضبط الإيقاع في المحتوى الطويل القابل للتمرير.</li>\n<li><strong>Uniform grid</strong> (شبكة منتظمة): شبكة مربّعات، مفيدة لرسم الأيقونات وفحص المحاذاة الدقيقة.</li>\n</ul>\n<p>للأعمدة والصفوف أربع خصائص. <strong>Count</strong> هو العدد. و<strong>Type</strong> يحدّد طريقة توزّعها: <strong>Stretch</strong> يجعلها تكبر مع الـ frame، بينما Left وCenter وRight تُبقي الأعمدة بعرض ثابت ومثبّتة في تلك الجهة. و<strong>Margin</strong> هو المسافة بين الأعمدة الخارجية وحوافّ الـ frame. و<strong>Gutter</strong> هو المسافة بين الأعمدة.</p>\n<p>لشاشات الهاتف في Steady، استخدم guide من 4 أعمدة من نوع Stretch بهامش 20 px وgutter بمقدار 16 px.</p>\n<figure class=\"diagram\"><svg class=\"diagram-svg\" focusable=\"false\" viewBox=\"0 0 680 320\" role=\"img\" aria-labelledby=\"l-fig-2-3-t1\"><defs><marker id=\"arrow-l-fig-2-3-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-2-3-t1\">frame هاتف فيه أربعة أعمدة متمدّدة، وهامشان بمقدار 20 بكسل على الجانبين، وفواصل بمقدار 16 بكسل بين الأعمدة. قائمة العادات تمتدّ على الأعمدة الأربعة؛ وبطاقتا إحصاءات تمتدّ كلٌّ منهما على عمودين.</title>\n  <rect class=\"d-box\" x=\"190\" y=\"10\" width=\"300\" height=\"300\" rx=\"20\"/>\n  <rect class=\"d-box-warn\" x=\"206\" y=\"10\" width=\"58\" height=\"300\"/>\n  <rect class=\"d-box-warn\" x=\"276\" y=\"10\" width=\"58\" height=\"300\"/>\n  <rect class=\"d-box-warn\" x=\"346\" y=\"10\" width=\"58\" height=\"300\"/>\n  <rect class=\"d-box-warn\" x=\"416\" y=\"10\" width=\"58\" height=\"300\"/>\n  <rect class=\"d-box-primary\" x=\"206\" y=\"40\" width=\"268\" height=\"40\" rx=\"8\"/>\n  <text class=\"d-label\" x=\"340\" y=\"65\" text-anchor=\"middle\">قائمة العادات: 4 أعمدة</text>\n  <rect class=\"d-box-accent\" x=\"206\" y=\"100\" width=\"128\" height=\"70\" rx=\"8\"/>\n  <text class=\"d-label\" x=\"268\" y=\"140\" text-anchor=\"middle\">إحصاء: 2</text>\n  <rect class=\"d-box-accent\" x=\"346\" y=\"100\" width=\"128\" height=\"70\" rx=\"8\"/>\n  <text class=\"d-label\" x=\"410\" y=\"140\" text-anchor=\"middle\">إحصاء: 2</text>\n  <path class=\"d-line\" d=\"M190 230 L206 230\"/>\n  <text class=\"d-label-muted\" x=\"180\" y=\"235\" text-anchor=\"end\">margin 20</text>\n  <path class=\"d-line\" d=\"M264 260 L276 260\"/>\n  <text class=\"d-label-muted\" x=\"270\" y=\"290\" text-anchor=\"middle\">gutter 16</text>\n  <path class=\"d-line\" d=\"M474 230 L490 230\"/>\n  <text class=\"d-label-muted\" x=\"500\" y=\"235\">margin 20</text>\n</svg><figcaption>guide من 4 أعمدة متمدّدة على شاشة Today في Steady</figcaption></figure>\n<p>معظم محتوى الهاتف يمتدّ على الأعمدة الأربعة؛ ويثبت الـ guide قيمته حين تقسم العرض، مثل بطاقتي إحصاءات متجاورتين في شاشة Habit detail، تمتدّ كلٌّ منهما على عمودين. وعلى الجهاز اللوحي ستنتقل إلى 8 أو 12 عمودًا بهوامش أعرض. ويمكنك حفظ الـ guide كـ style لتستخدم كل الشاشات الـ guide نفسه.</p>\n<h2 id=\"sec-2\" tabindex=\"-1\">نظام الـ 8 نقاط</h2>\n<p>نظام الـ 8 نقاط (8-point system) يقول: المسافات وأحجام الـ components مضاعفات للرقم 8، مع السماح بـ 4 كنصف خطوة للتفاصيل الصغيرة. الأسباب عملية، لا غامضة:</p>\n<ul>\n<li><strong>تدرّج نظيف.</strong> الهواتف ترسم بكثافة 2× أو 3×، وبعض أجهزة Android بكثافة 1.5×. مضاعفات 8 تبقى بكسلات كاملة في كل كثافة: 8 × 1.5 = 12. أما فجوة بمقدار 5 px فتصبح 7.5، فتُطمس الحوافّ.</li>\n<li><strong>قرارات أقل.</strong> الاختيار بين 16 و24 سريع. أما الاختيار بين 14 و15 و16 و17 و18 فنقاش طويل.</li>\n<li><strong>مفردات مشتركة.</strong> يقرأ المطوّر “16” في Dev Mode، ويطابقها مع token للمسافات، ولا يتساءل أحد هل كانت 15 مقصودة.</li>\n</ul>\n<p>سلّم المسافات في Steady قصير ومسمّى:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"text\" data-index=\"0\"><div class=\"code-head\"><span class=\"code-title\">Text</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>space-1    4   icon-to-label, name-to-streak\nspace-2    8   between habit rows, between chips\nspace-3   12   inside rows, gap between row elements\nspace-4   16   card padding, gutter\nspace-5   20   screen side margin\nspace-6   24   between blocks on a screen\nspace-8   32   between the header and the content\nspace-12  48   tap height of the Save habit button</code></pre></div>\n<p>ربما لاحظت أن 12 و20 ليستا من مضاعفات 8. هذه قاعدة نصف الخطوة: الزيادات بمقدار 4 نقاط مسموحة حيث تكون خطوة 8 كبيرة أكثر من اللازم، وتعمل فرق كثيرة بهذه الطريقة، منها الفريق الذي يقف وراء Material Design. ما يهمّ أن تكون القائمة قصيرة وأن يستخدمها الجميع. والأسماء (<code dir=\"ltr\">space-4</code> تعني 16) ستصبح variables في القسم 3، فيعيش السلّم في الملف لا في ذاكرة أحدهم.</p>\n<p>والنص يُعامَل بالطريقة نفسها: ارتفاعات الأسطر في سلّم أحجام الخط الخاص بـ Steady (24 و20 و16) مضاعفات للرقم 4، فيقع ارتفاع أي كتلة نص دائمًا على الشبكة ويتناغم مع الـ padding المحيط بها.</p>\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>قيم مثل 13 أو 18 أو 22 نادرًا ما تأتي من قرار. تأتي من سحب طبقة حتى بدت صحيحة، أو من نسخ frame من ملف آخر. قبل التسليم، حدّد الـ frames واقرأ الـ gap والـ padding فيها؛ وكل قيمة خارج السلّم إمّا خطأ أو تستحقّ سببًا مكتوبًا.</p>\n</aside>\n<aside class=\"callout callout-tip\" 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=\"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5\"/><path d=\"M9 18h6\"/><path d=\"M10 22h4\"/></svg><span><span class=\"callout-kind\">نصيحة</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>اجعل لوحة المفاتيح متوافقة مع النظام</span></p>\n<p>‏Shift مع أحد مفاتيح الأسهم يحرّك العنصر 10 px افتراضيًا. وقت كتابة هذا الدرس، يمكنك تغيير التحريك الكبير إلى 8 من تفضيلات Figma (Nudge amount)، فتقع حركات لوحة المفاتيح على النظام.</p>\n</aside>\n<p>الشبكة في خدمتك، لا العكس. أيقونة التشغيل داخل دائرة تبدو منحرفة عن المركز حين تكون متوسّطة رياضيًا، لأن ثقلها البصري يميل إلى اليسار؛ فيحرّكها المصمّمون 1 أو 2 px إلى اليمين عن قصد. هذا تصحيح بصري له سبب، وهو بالضبط ما يسمح به النظام.</p>\n<p>في الدرس التالي تجمع الـ Layout guides والـ Auto layout والـ constraints معًا، وتجعل شاشة واحدة تعمل على الهواتف من الصغيرة إلى الكبيرة.</p>\n","toc":[{"id":"sec-1","text":"الـ Layout guides","level":2},{"id":"sec-2","text":"نظام الـ 8 نقاط","level":2}],"takeaways":["الـ Layout guides (التي كانت تُسمّى layout grids) أدوات بصرية مساعدة على الـ frame؛ الأعمدة والصفوف والشبكة المنتظمة تساعدك على المحاذاة، لكنها لا تحرّك شيئًا نيابة عنك.","تخطيط الهاتف يحتاج عادةً guide من 4 أعمدة بهوامش جانبية وفواصل (gutters) ثابتة؛ والأجهزة اللوحية وسطح المكتب تستخدم أعمدة أكثر.","نظام الـ 8 نقاط يحصر المسافات والأحجام في مضاعفات 8، مع 4 كنصف خطوة، فتتدرّج القيم بشكل نظيف وتبقى متّسقة.","سلّم مسافات قصير ومسمّى يحوّل الجدال حول 14 أو 15 بكسل إلى اختيار الخطوة الصحيحة.","ارتفاعات الأسطر على مضاعفات 4 تُبقي كتل النص على إيقاع واحد مع بقية التخطيط."],"further":[{"title":"Create layout guides","url":"https://help.figma.com/hc/en-us/articles/360040450513-Create-layout-guides"},{"title":"Combine layout guides and constraints","url":"https://help.figma.com/hc/en-us/articles/360039957934-Combine-layout-guides-and-constraints"},{"title":"Grids and spacing (Material Design 3)","url":"https://m3.material.io/foundations/layout/understanding-layout/spacing"}],"quiz":[{"q":"<p>بطاقة العادة عند زميلك تستخدم padding بمقدار 14 px وgap بمقدار 10 px و22 px بين البطاقات. تنتقل إلى سلّم الـ 8 نقاط في Steady. ما أفضل تحويل؟</p>","options":[{"text":"تبقى 14 و10 و22، لأن السلّم يطبَّق على العمل الجديد فقط.","why":"الأنظمة المختلطة هي بداية الانجراف. انقل القيم القديمة إلى السلّم كلما لمستها."},{"text":"تقريب كل شيء إلى 16، فتتطابق الفجوات الثلاث.","why":"المسافات المتساوية تمحو التجميع. الفجوات الداخلية والخارجية تحتاج خطوات مختلفة."},{"text":"padding بمقدار 16، وgap بمقدار 8، و24 بين البطاقات.","why":"صحيح. تنتقل كل قيمة إلى خطوة مجاورة على السلّم، وتحافظ النتيجة على قاعدة أن المسافة في الداخل أصغر منها في الخارج (8، ثم 16، ثم 24)."},{"text":"padding بمقدار 12، وgap بمقدار 12، و12 بين البطاقات.","why":"كل الفجوات متساوية من جديد، فتختلط البطاقات بمحتوياتها."}],"answer":2},{"q":"<p>ماذا تفعل الـ Layout guides في Figma حين تغيّر حجم الـ frame؟</p>","options":[{"text":"تنقل كل ابن إلى أقرب عمود تلقائيًا.","why":"الـ guides لا تحرّك الطبقات من تلقاء نفسها أبدًا. الـ constraints والـ Auto layout هي التي تحرّك."},{"text":"تعيد حساب الأعمدة (في حالة Stretch)، ويتبعها الأبناء المقيّدون بالأعمدة إذا ضبطت الـ constraints الخاصة بهم على ذلك.","why":"صحيح. أعمدة Stretch يتغيّر عرضها مع الـ frame، والـ constraints المرتبطة بالأعمدة تجعل الأبناء يتبعونها."},{"text":"لا شيء، لأن الـ Layout guides صورة ثابتة.","why":"أعمدة Stretch يتغيّر حجمها فعلًا مع الـ frame، وهذا ما يجعلها مفيدة في العمل المتجاوب."},{"text":"تحذف نفسها إذا أصبح الـ frame ضيّقًا جدًا.","why":"الـ guides لا تُحذف عند تغيير الحجم؛ إنها تصبح أضيق فقط."}],"answer":1},{"q":"<p>لماذا تختار فرق كثيرة الرقم 8 وحدةً أساسية بدل 5 أو 10؟</p>","options":[{"text":"مضاعفات 8 تنقسم بلا كسور على كثافات العرض الشائعة 1.5× و2× و3×، وتطابق أبعاد أجهزة كثيرة.","why":"صحيح. ‏8 × 1.5 = 12 بكسلًا كاملًا، بينما 5 × 1.5 = 7.5 تترك أنصاف بكسلات تطمس الحوافّ."},{"text":"لأن مقدار التحريك (nudge) في Figma ثابت على 8 px ولا يمكن تغييره.","why":"التحريك الكبير في Figma افتراضيًا 10 px ويمكن تغييره من التفضيلات. الأداة ليست السبب."},{"text":"لأن WCAG تشترط مسافات من مضاعفات 8.","why":"لدى WCAG قواعد للمسافات تخصّ تعديلات النص، لا وحدة أساسية للتخطيط."},{"text":"لأن الشاشات ترسم أسرع حين تقبل الأحجام القسمة على 8.","why":"لا توجد فائدة في سرعة الرسم. الفائدة هي التدرّج النظيف وقرارات أقل."}],"answer":0}],"exercise":{"kind":"spot-bug","language":"json","code":"{\n  \"screen\":        { \"paddingX\": 20, \"paddingTop\": 32, \"gap\": 24 },\n  \"title\":         { \"style\": \"Title\", \"lineHeight\": 36 },\n  \"statsRow\":      { \"flow\": \"horizontal\", \"gap\": 16 },\n  \"statCard\":      { \"padding\": 14, \"gap\": 4 },\n  \"calendar\":      { \"flow\": \"grid\", \"gap\": 8, \"cellSize\": 40 },\n  \"streakBanner\":  { \"padding\": 16, \"gap\": 12, \"radius\": 12 },\n  \"editButton\":    { \"height\": 48, \"paddingX\": 18, \"radius\": 12 },\n  \"caption\":       { \"style\": \"Caption\", \"lineHeight\": 16 }\n}","bugLines":[5,8],"title":"دقّق المسافات في شاشة Habit detail","prompt":"<p>أرسل متعاقد مواصفات المسافات لشاشة Habit detail في Steady بصيغة JSON. يستخدم Steady سلّمًا من مضاعفات 8 مع نصف خطوة بمقدار 4: <strong>4, 8, 12, 16, 20, 24, 32, 48</strong>، وارتفاعات أسطر على مضاعفات 4. حدّد كل سطر فيه قيمة خارج النظام.</p>\n","hints":["افحص كل رقم مقابل السلّم، بما في ذلك الـ padding داخل الـ components الصغيرة.","نصف قطر الزوايا وأحجام الخلايا تُحسب أيضًا، لكنها كلها سليمة هنا. ركّز على قيم الـ padding.","في سطرين قيمة padding ليست من مضاعفات 4."],"explanation":"<p>السطر 5: الـ padding في <code dir=\"ltr\">statCard</code> بقيمة <strong>14</strong> خارج السلّم. استخدم <strong>16</strong>، وهو الـ padding نفسه في البطاقات الأخرى، فتصطفّ بطاقات الإحصاءات مع شريط الـ streak. السطر 8: الـ padding الأفقي في <code dir=\"ltr\">editButton</code> بقيمة <strong>18</strong> خارج السلّم. استخدم <strong>16</strong> (أو 20 إن احتاجت التسمية مساحة أكبر)؛ فمع ارتفاع 48 px ونصف قطر زوايا 12 px، تتّسق 16 مع بقية المجموعة. كل ما عدا ذلك على النظام: 20 و24 و32 للشاشة، و16 و8 للفجوات، وخلية تقويم بحجم 40 px، وارتفاعا سطر 36 و16.</p>\n","checkLabels":{}},"words":639,"readMinutes":4}