{"id":"l-fig-2-1","courseId":"figma-ui-design","lang":"ar","kind":"lesson","summary":"حوّل الـ frames الثابتة إلى frames بـ Auto layout ترصّ أبناءها باتّجاه محدّد وgap وpadding ومحاذاة، وضع بعضها داخل بعض لتبني صف العادة وقائمة العادات في Steady.","html":"<p>في الدرس السابق بنيت صف عادة بوضع أيقونة واسم وstreak وزر تعليم يدويًا. الآن غيّر “Read” إلى “Read 20 pages before bed”. يصطدم الاسم بزر التعليم. أضف سطرًا ثانيًا فيتداخل الـ streak مع الصف التالي. كل تغيير في المحتوى يعني تحريك الطبقات، وفي التطبيق الحقيقي يتغيّر المحتوى كل يوم.</p>\n<p>الـ Auto layout هو إجابة Figma: تخبر الـ frame <em>كيف</em> يرتّب أبناءه، فيضعهم في أماكنهم نيابة عنك، في كل مرة يتغيّر فيها أي شيء.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">الإعدادات الثلاثة الأهم</h2>\n<p>حدّد طبقات صف العادة واضغط <code dir=\"ltr\">Shift+A</code>، أو انقر <strong>Add auto layout</strong> في الشريط الجانبي الأيمن. يلفّها Figma في frame بـ Auto layout ويخمّن الإعدادات مبدئيًا. ثلاثة منها تؤدّي معظم العمل.</p>\n<p>الـ <strong>Flow</strong> هو الاتّجاه الذي يُوضع فيه الأبناء. وقت كتابة هذا الدرس، يقدّم Figma الخيارات <strong>Vertical</strong> و<strong>Horizontal</strong> و<strong>Grid</strong>. الـ Vertical يرصّ الأبناء من الأعلى إلى الأسفل، مثل قائمة العادات. والـ Horizontal يصفّهم جنبًا إلى جنب، مثل محتوى صف واحد. والـ Grid يضعهم في صفوف وأعمدة، وهذا يناسب تخطيطًا ثنائي البعد مثل منتقي الأيقونات في لوحة New habit.</p>\n<p>الـ <strong>Gap</strong> هو المسافة <em>بين</em> الأبناء. إنه رقم واحد للـ frame كله، فيكون كل ابن على المسافة نفسها من الذي يليه. يمكنك أيضًا اختيار التوزيع التلقائي، الذي يقدّم وقت الكتابة الخيارات Between وAround وEvenly، لتوزيع المساحة المتبقية بدل تثبيتها. استخدم رقمًا ثابتًا في أغلب الحالات؛ فالتوزيع التلقائي لحالات مثل شريط التبويبات حيث تنتشر العناصر على كامل العرض.</p>\n<p>الـ <strong>Padding</strong> هو المسافة بين الأبناء وحوافّ الـ frame نفسه. يمكنك ضبطه لكل الجهات دفعة واحدة، أو للأفقي والعمودي كلٌّ على حدة، أو لكل جهة منفردة.</p>\n<h2 id=\"sec-2\" tabindex=\"-1\">بناء صف العادة</h2>\n<p>هذا هو الصف كـ frames متداخلة بـ Auto layout. لكل frame وظيفة واحدة.</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>Habit row        Horizontal · gap 12 · padding 12 top/bottom, 16 left/right · align center\n├─ Icon          32 × 32\n├─ Text stack    Vertical · gap 4\n│  ├─ Habit name   Headline 17/24\n│  └─ Streak       Caption 13/16\n└─ Check button  32 × 32 circle</code></pre></div>\n<p>كومة النصوص frame عمودي مستقلّ لأن الاسم والـ streak مجموعة واحدة (الدرس 1.2: فجوة صغيرة في الداخل، وأكبر في الخارج). والصف أفقي لأن الأيقونة والنص والزر تجلس جنبًا إلى جنب. الـ 4 px داخل كومة النصوص أصغر من الـ 12 px بين عناصر الصف، وهذه أصغر من المسافة بين الصفوف. صار القُرب الآن جزءًا من البنية نفسها، لا شيئًا تحافظ عليه يدويًا.</p>\n<figure class=\"diagram\"><svg class=\"diagram-svg\" focusable=\"false\" viewBox=\"0 0 680 220\" role=\"img\" aria-labelledby=\"l-fig-2-1-t1\"><defs><marker id=\"arrow-l-fig-2-1-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-1-t1\">frame لصف عادة فيه padding بمقدار 16 بكسل يسارًا ويمينًا و12 بكسل أعلى وأسفل. في داخله أيقونة وكومة نصوص وزر تعليم تفصل بينها فجوات 12 بكسل. وتضمّ كومة النصوص الاسم والـ streak بفجوة 4 بكسل.</title>\n  <rect class=\"d-box\" x=\"20\" y=\"40\" width=\"640\" height=\"120\" rx=\"14\"/>\n  <rect class=\"d-box-warn\" x=\"20\" y=\"40\" width=\"40\" height=\"120\" rx=\"0\"/>\n  <rect class=\"d-box-warn\" x=\"620\" y=\"40\" width=\"40\" height=\"120\" rx=\"0\"/>\n  <text class=\"d-label-muted\" x=\"40\" y=\"182\" text-anchor=\"middle\">16</text>\n  <text class=\"d-label-muted\" x=\"640\" y=\"182\" text-anchor=\"middle\">16</text>\n  <rect class=\"d-box-primary\" x=\"60\" y=\"70\" width=\"60\" height=\"60\" rx=\"10\"/>\n  <text class=\"d-label\" x=\"90\" y=\"105\" text-anchor=\"middle\">أيقونة</text>\n  <rect class=\"d-box-success\" x=\"120\" y=\"70\" width=\"30\" height=\"60\" rx=\"0\"/>\n  <text class=\"d-label-muted\" x=\"135\" y=\"150\" text-anchor=\"middle\">12</text>\n  <rect class=\"d-box-accent\" x=\"150\" y=\"62\" width=\"380\" height=\"76\" rx=\"8\"/>\n  <text class=\"d-label-strong\" x=\"166\" y=\"90\">Read 20 pages</text>\n  <text class=\"d-label-muted\" x=\"166\" y=\"124\">12-day streak</text>\n  <text class=\"d-label-muted\" x=\"520\" y=\"108\" text-anchor=\"end\">gap 4</text>\n  <rect class=\"d-box-success\" x=\"530\" y=\"70\" width=\"30\" height=\"60\" rx=\"0\"/>\n  <text class=\"d-label-muted\" x=\"545\" y=\"150\" text-anchor=\"middle\">12</text>\n  <circle class=\"d-dot\" cx=\"590\" cy=\"100\" r=\"30\"/>\n  <text class=\"d-label-muted\" x=\"340\" y=\"28\" text-anchor=\"middle\">padding علوي 12</text>\n  <text class=\"d-label-muted\" x=\"340\" y=\"206\" text-anchor=\"middle\">padding سفلي 12</text>\n</svg><figcaption>تشريح صف العادة: الـ padding في الخارج، والـ gap بين الأبناء</figcaption></figure>\n<p>الآن رُصّ الصفوف. حدّد كل الصفوف واضغط <code dir=\"ltr\">Shift+A</code> مرة أخرى: يلفّها Figma في frame عمودي، هو <code dir=\"ltr\">Habit list</code>، بـ gap مقداره 8 px. لُفّ كتلة التقدّم والقائمة في frame عمودي بـ gap مقداره 24 px، ثم لُفّ الترويسة وذلك الـ frame في frame عمودي آخر بـ padding أفقي 20 px وgap مقداره 32 px. مستويان من الـ gap يعطيانك المسافات المتدرّجة من الدرس 1.2، وصارت شاشة Today كلها مبنية بالـ Auto layout. غيّر أي اسم، أو أضف عادة سادسة، أو احذف واحدة، وسيتحرّك كل ما تحتها ليفسح المجال.</p>\n<h2 id=\"sec-3\" tabindex=\"-1\">المحاذاة</h2>\n<p>كل frame بـ Auto layout يتحكّم أيضًا في كيفية اصطفاف أبنائه على المحور المعاكس للـ flow. في الصف الأفقي، تختار هل يجلس الأبناء في أعلى الصف أم وسطه أم أسفله؛ وفي الكومة العمودية، هل يلتصقون باليسار أم الوسط أم اليمين. صف العادة يستخدم المحاذاة في الوسط حتى تصطفّ الأيقونة وزر التعليم مع منتصف النص، سواء كان الاسم سطرًا واحدًا أم سطرين.</p>\n<p>ولصفوف النصوص ذات الأحجام المختلفة، تقدّم الـ frames الأفقية وقت الكتابة محاذاة على خط الأساس (baseline)، التي تصفّ أسفل الحروف بدل أسفل الصناديق. وهي مثالية لتسمية وقيمة جنبًا إلى جنب، مثل “Streak” و&quot;12 days&quot;.</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>حين يلتصق عنصر بجاره أكثر من اللازم، يضيف المبتدئون مستطيلًا فارغًا كفاصل، أو يلفّون الابن في frame إضافي فقط ليمنحوه padding. كلا الحلّين يخفي المسافات حيث لا يبحث عنها أحد. اسأل بدلًا من ذلك: هل هذه مسافة <em>بين</em> إخوة (الـ gap في الأب) أم مسافة <em>داخل</em> حاوية (الـ 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>حين يبدو frame بـ Auto layout خاطئًا، حدّد الأب أولًا واقرأ الـ flow والـ gap والـ padding والمحاذاة في الشريط الجانبي الأيمن. في تسع مرات من عشر يكون الإصلاح إعدادًا واحدًا في الأب، لا أي شيء في الابن الذي تحدّق فيه.</p>\n</aside>\n<p>صار صف العادة يتراصّ بشكل صحيح. ما لا يفعله بعد هو التمدّد ليملأ عرض الشاشة، أو السماح للأسماء الطويلة بالالتفاف في المكان الصحيح. هذا هو تغيير الحجم (resizing)، موضوع الدرس التالي.</p>\n","toc":[{"id":"sec-1","text":"الإعدادات الثلاثة الأهم","level":2},{"id":"sec-2","text":"بناء صف العادة","level":2},{"id":"sec-3","text":"المحاذاة","level":2}],"takeaways":["الـ Auto layout يجعل الـ frame يرتّب أبناءه نيابة عنك، فلا يعني تغيير المحتوى بعد الآن تحريك الطبقات يدويًا.","الـ Flow يحدّد الاتّجاه (عمودي أو أفقي أو شبكي)، والـ gap يحدّد المسافة بين الأبناء، والـ padding يحدّد المسافة بين الأبناء وحوافّ الـ frame.","المسافات مسؤولية الـ frame الأب، لا مستطيلات فارغة تُستخدم كفواصل ولا إزاحات على الأبناء.","الـ components الحقيقية frames متداخلة بـ Auto layout، مثل صف أفقي يحتوي على كومة نصوص عمودية.","معظم أخطاء الـ Auto layout تأتي من إعدادات على المستوى الخطأ من التداخل، فافحص الأب قبل أن تلوم الابن."],"further":[{"title":"Guide to auto layout","url":"https://help.figma.com/hc/en-us/articles/360040451373-Guide-to-auto-layout"},{"title":"Use the horizontal and vertical flows in auto layout","url":"https://help.figma.com/hc/en-us/articles/31289464393751-Use-the-horizontal-and-vertical-flows-in-auto-layout"}],"quiz":[{"q":"<p>تغيّر اسم عادة من “Run” إلى “Run 5 km before work” داخل صف عادة يستخدم Auto layout. ماذا يحدث لزر التعليم على اليمين؟</p>","options":[{"text":"يتداخل مع الاسم الأطول حتى تحرّكه بنفسك.","why":"هذا ما يحدث في frame بلا Auto layout. الـ Auto layout يعيد حساب المواضع كلما تغيّر المحتوى."},{"text":"يبقى في مكانه تمامًا، لأن الأزرار ثابتة.","why":"الأبناء في الـ Auto layout ليس لهم x وy ثابتان. موضعهم يأتي من الـ flow والـ gap وإخوتهم."},{"text":"يُدفع على امتداد الـ flow، أو يلتفّ الاسم إلى سطر جديد، بحسب إعدادات تغيير الحجم للصف والنص.","why":"صحيح. يعيد الصف ترتيب نفسه ويحافظ الزر على الـ gap بينه وبين النص. أما هل يلتفّ الاسم أم يكبر الصف فهو خيار من خيارات تغيير الحجم (الدرس التالي)."},{"text":"يعرض Figma تحذيرًا بأن المحتوى لم يعد يتّسع.","why":"لا يوجد تحذير كهذا في Figma. الـ Auto layout يكيّف التخطيط بدلًا من ذلك."}],"answer":2},{"q":"<p>كومة النصوص داخل صف العادة فيها gap بمقدار 4 px، وللصف padding أيسر بمقدار 16 px. أضاف مصمّم مستطيلًا فارغًا بعرض 16 px قبل الأيقونة ليدفعها إلى اليمين. ما الخطأ؟</p>","options":[{"text":"لا شيء، لأن النتيجة تبدو متطابقة.","why":"تبدو متطابقة إلى أن يغيّر أحدهم الـ padding أو يستبدل الأيقونة. الفواصل المخفية تجعل فهم المسافات وتسليمها مستحيلًا."},{"text":"المسافات يجب أن تأتي من الـ padding والـ gap في الأب، لا من طبقات غير مرئية.","why":"صحيح. إذا احتاجت الأيقونة مساحة أكبر، فغيّر الـ padding في الصف. الطبقات الفاصلة تظهر كمربّعات غامضة في Dev Mode."},{"text":"لا يمكن أن تكون المستطيلات أبناءً لـ frames بـ Auto layout.","why":"يمكن ذلك. المشكلة في استخدام المستطيل كفاصل، لا في كونه مسموحًا."},{"text":"يجب أن يكون المستطيل 8 px حتى يبقى المجموع على شبكة الـ 8 نقاط.","why":"تغيير الحجم يُبقي مشكلة الفاصل المخفي. قيم المسافات مكانها الـ padding والـ gap."}],"answer":1},{"q":"<p>أيّ بنية تصف صف العادة في Steady على أفضل وجه؟</p>","options":[{"text":"frame عمودي بـ Auto layout يحتوي الأيقونة والاسم والـ streak وزر التعليم.","why":"كومة عمودية واحدة ستضع زر التعليم تحت الـ streak بدل أن يكون بجانب النص."},{"text":"group يحتوي أربع طبقات موضوعة يدويًا.","why":"الـ groups لا تستخدم Auto layout، فكل تغيير في المحتوى يعني إعادة التموضع يدويًا."},{"text":"Auto layout شبكي (Grid) بعمود لكل عنصر.","why":"الـ Grid يناسب التخطيطات ثنائية البعد مثل منتقي الأيقونات، لا صفًا واحدًا فيه كومة نصوص متداخلة."},{"text":"frame أفقي بـ Auto layout يحتوي الأيقونة وكومة نصوص عمودية وزر التعليم.","why":"صحيح. الصف يمتدّ أفقيًا، والاسم والـ streak يتراصّان عموديًا داخل frame خاص بهما."}],"answer":3},{"q":"<p>داخل صف عادة أفقي، تجلس الأيقونة في الأعلى بينما النص وزر التعليم في المنتصف. أين تصلح ذلك؟</p>","options":[{"text":"في frame الصف، بضبط المحاذاة بحيث يتوسّط الأبناء عموديًا.","why":"صحيح. محاذاة الأبناء خاصية من خصائص الـ frame الأب الذي يستخدم Auto layout."},{"text":"في الأيقونة، بتحريكها 6 px إلى الأسفل.","why":"لا يمكنك تحديد موضع ابن يدويًا في الـ Auto layout دون إخراجه من الـ flow. المحاذاة مكانها الأب."},{"text":"في الصفحة، بإضافة Layout guide.","why":"الـ Layout guides تساعدك على محاذاة الـ frames، لكنها لا تغيّر محاذاة الـ Auto layout."}],"answer":0}],"exercise":{"kind":"fill","language":"text","template":"Chip (auto layout)\n  Flow:                  {{0}}\n  Gap between items:     {{1}}\n  Padding left/right:    {{2}}\n  Padding top/bottom:    {{3}}\n  Align children:        {{4}}\n\nFrequency chips (auto layout)\n  Flow:                  {{5}}\n  Gap between items:     {{6}}","blanks":[{"answers":["Horizontal"]},{"answers":["4","4px","4 px"]},{"answers":["12","12px","12 px"]},{"answers":["6","6px","6 px"]},{"answers":["Center","Centre","Middle","Center vertically","Centered","Centred","Vertical center","Left center","Center left"]},{"answers":["Horizontal"]},{"answers":["8","8px","8 px"]}],"title":"اضبط شرائح التكرار","prompt":"<p>في لوحة New habit صفّ من شرائح التكرار (chips): <strong>Daily</strong> و<strong>Weekdays</strong> و<strong>Weekends</strong> و<strong>Custom</strong>. كل شريحة أيقونة بحجم 16 × 16 تليها تسميتها. من مواصفات المطوّر (redline):</p>\n<ul>\n<li>في كل شريحة، تفصل <strong>4 px</strong> بين الأيقونة والتسمية، وهما متوسّطتان عموديًا إحداهما بالنسبة للأخرى.</li>\n<li>محتوى الشريحة يبعد <strong>12 px</strong> عن حافّتيها اليسرى واليمنى و<strong>6 px</strong> عن حافّتيها العليا والسفلى.</li>\n<li>الشرائح متجاورة، وبين كل اثنتين <strong>8 px</strong>.</li>\n</ul>\n<p>أكمل إعدادات الـ Auto layout لشريحة واحدة وللصف الذي يحمل الشرائح الأربع. استخدم الأسماء كما يعرضها Figma (Vertical أو Horizontal أو Grid للـ flow، وTop أو Center أو Bottom للمحاذاة) والأرقام بالـ px.</p>\n","hints":["هناك frame-ان: كل شريحة، والصف الذي يحتوي الشرائح. أيّهما يملك الـ 8 px؟","المسافة بين الأبناء هي الـ gap؛ والمسافة بين الأبناء وحافّة الـ frame هي الـ padding.","الشريحة: Horizontal، وgap ‏4، وpadding ‏12 و6، ومحاذاة Center. الصف: Horizontal، وgap ‏8."],"explanation":"<p>كل شريحة frame بـ Auto layout من نوع <strong>Horizontal</strong> لأن الأيقونة والتسمية متجاورتان. الـ 4 px بينهما هي <strong>الـ gap</strong> في الشريحة؛ والـ 12 px والـ 6 px حولهما هي <strong>الـ padding</strong> الخاص بها (والـ 6 خارج سلّم المسافات عن قصد: مع سطر تسمية بارتفاع 20 px تعطي الشريحة ارتفاعًا مضبوطًا قدره 32 px، وهذا هو نوع السبب المكتوب الذي يطلبه الدرس 2.3)؛ والتوسيط هو محاذاة الشريحة، ويُضبط في الأب لا بتحريك الأيقونة. أما الـ 8 px بين الشرائح فتخصّ الصف الأب، وهو frame آخر من نوع <strong>Horizontal</strong> بـ gap مقداره <strong>8</strong> px. وضع كل قيمة على الـ frame الذي يملكها يعني أن المطوّر يستطيع قراءتها مباشرة من Dev Mode، وأن تسمية أطول مثل “Weekends” تكبّر شريحتها دون أن تكسر الصف.</p>\n","checkLabels":{}},"words":663,"readMinutes":4}