{"id":"l-fig-4-1","courseId":"figma-ui-design","lang":"ar","kind":"lesson","summary":"اصنع prototype لمسار تسجيل العادة في Steady بالـ triggers والـ actions والحركات، واجعل زر التعليم interactive component، وافتح لوحة New habit كـ overlay، واستخدم Smart animate بشكل صحيح.","html":"<p>النموذج الثابت يُظهر شكل Steady. أما الـ prototype (النموذج التفاعلي) فيُظهر إحساسه: هل يعطي النقر على زر التعليم استجابة مُرضية، وهل تأتي لوحة New habit من حيث يتوقّع الناس، وهل يستطيع أحدهم إيجاد طريق العودة؟ اختبار هذه الأسئلة بـ prototype يكلّف بضع ساعات. واختبارها بعد التطوير يكلّف sprint كاملًا.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">التفاعلات: trigger وaction وحركة</h2>\n<p>بدّل الشريط الجانبي الأيمن إلى تبويب <strong>Prototype</strong>. حدّد طبقة، واسحب مقبض الوصلة الذي يظهر إلى frame وجهة، فتكون قد أنشأت <strong>تفاعلًا (interaction)</strong>. لكل تفاعل ثلاثة أجزاء.</p>\n<p>الـ <strong>trigger</strong> هو ما يفعله الشخص. وقت كتابة هذا الدرس، تشمل الـ triggers ‏On click/On tap وOn drag وWhile hovering وWhile pressing وKey/Gamepad وMouse enter وMouse leave وMouse down وMouse up وAfter delay. في تطبيق الهاتف تستخدم غالبًا On tap، إضافة إلى On drag لإيماءات السحب.</p>\n<p>الـ <strong>action</strong> هو ما يحدث. أشيعها <strong>Navigate to</strong> إلى frame آخر، و<strong>Back</strong>، و<strong>Change to</strong> إلى variant آخر من component، و<strong>Open overlay</strong>، و<strong>Swap overlay</strong>، و<strong>Close overlay</strong>، و<strong>Scroll to</strong>. والـ prototypes المتقدّمة يمكنها أيضًا ضبط variables واستخدام الشروط، وهذا يعتمد على الخطة.</p>\n<p>الـ <strong>animation</strong> هي طريقة الحركة: Instant، أو Dissolve، أو Smart animate، أو الحركات الاتّجاهية مثل Move in وPush وSlide in، ولكلٍّ منها easing ومدّة. في Steady، الأقصر والأهدأ هو الأفضل: Smart animate أو Push، مع Ease out، لمدّة بين 250 و300 ms أو نحو ذلك.</p>\n<p>هذا مسار تسجيل العادة الذي ستبنيه:</p>\n<figure class=\"diagram\"><svg class=\"diagram-svg\" focusable=\"false\" viewBox=\"0 0 680 260\" role=\"img\" aria-labelledby=\"l-fig-4-1-t1\"><defs><marker id=\"arrow-l-fig-4-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-4-1-t1\">شاشة Today هي نقطة البداية. النقر على زر التعليم يغيّر الصف إلى Done داخل الـ component. والنقر على زر الإضافة يفتح لوحة New habit كـ overlay، وSave يغلقها. والنقر على صف ينتقل إلى Habit detail، وBack يعيد إلى Today.</title>\n  <rect class=\"d-box-primary\" x=\"250\" y=\"90\" width=\"180\" height=\"70\" rx=\"14\"/>\n  <text class=\"d-label-strong\" x=\"340\" y=\"122\" text-anchor=\"middle\">Today</text>\n  <text class=\"d-label-muted\" x=\"340\" y=\"144\" text-anchor=\"middle\">نقطة بداية المسار</text>\n  <rect class=\"d-box-success\" x=\"20\" y=\"20\" width=\"180\" height=\"56\" rx=\"12\"/>\n  <text class=\"d-label\" x=\"110\" y=\"45\" text-anchor=\"middle\">الصف: Done</text>\n  <text class=\"d-label-muted\" x=\"110\" y=\"64\" text-anchor=\"middle\">Change to (في الـ component)</text>\n  <path class=\"d-arrow\" d=\"M250 105 L202 66\" marker-end=\"url(#arrow-l-fig-4-1-1)\"/>\n  <rect class=\"d-box-accent\" x=\"480\" y=\"20\" width=\"180\" height=\"56\" rx=\"12\"/>\n  <text class=\"d-label\" x=\"570\" y=\"45\" text-anchor=\"middle\">لوحة New habit</text>\n  <text class=\"d-label-muted\" x=\"570\" y=\"64\" text-anchor=\"middle\">Open overlay</text>\n  <path class=\"d-arrow\" d=\"M430 105 L478 66\" marker-end=\"url(#arrow-l-fig-4-1-1)\"/>\n  <rect class=\"d-box\" x=\"250\" y=\"200\" width=\"180\" height=\"50\" rx=\"12\"/>\n  <text class=\"d-label\" x=\"340\" y=\"230\" text-anchor=\"middle\">Habit detail</text>\n  <path class=\"d-arrow\" d=\"M320 160 L320 198\" marker-end=\"url(#arrow-l-fig-4-1-1)\"/>\n  <path class=\"d-arrow d-dashed\" d=\"M360 198 L360 162\" marker-end=\"url(#arrow-l-fig-4-1-1)\"/>\n  <text class=\"d-label-muted\" x=\"300\" y=\"184\" text-anchor=\"end\">نقر الصف: Push</text>\n  <text class=\"d-label-muted\" x=\"380\" y=\"184\">Back</text>\n  <path class=\"d-arrow d-dashed\" d=\"M520 78 L430 128\" marker-end=\"url(#arrow-l-fig-4-1-1)\"/>\n  <text class=\"d-label-muted\" x=\"560\" y=\"110\">Save: ‏Close overlay</text>\n</svg><figcaption>مسار الـ prototype لتسجيل العادة في Steady</figcaption></figure>\n<h2 id=\"sec-2\" tabindex=\"-1\">الـ Interactive components: زر التعليم</h2>\n<p>يمكنك رسم وصلة من كل زر تعليم إلى نسخة من الشاشة يكون فيها ذلك الصف معلَّمًا. مع خمس عادات، هذه 32 تركيبة من الشاشات. بدلًا من ذلك، افتح الـ component set الخاص بـ <strong>Check button</strong> وأضف التفاعل <em>بين الـ variants الخاصة به</em>: على الـ variant ‏To do، ‏On tap، ثم <strong>Change to</strong> ‏Done، مع Smart animate لمدّة 200 ms. وأضف العكس على Done.</p>\n<p>الآن كل instance من زر التعليم، في كل شاشة، تتبدّل وحدها حين تُنقر في الـ prototype. هذا <strong>interactive component</strong>، ولهذا تؤتي الـ variants المتقنة من الدرس 3.2 ثمارها مرّتين.</p>\n<h2 id=\"sec-3\" tabindex=\"-1\">الـ Overlays: لوحة New habit</h2>\n<p>زر الإضافة يفتح لوحة New habit، التي تنزلق إلى الأعلى فوق Today بدل أن تحلّ محلّها. صِل زر الإضافة بـ frame اللوحة باستخدام <strong>Open overlay</strong>. في إعدادات الـ overlay، اختر موضعًا أسفل المنتصف، وفعّل الإغلاق عند النقر خارجها، وأضف خلفية خلف الـ overlay (لون داكن بشفافية نحو 40% يعتّم الشاشة). واستخدم حركة Move in من الأسفل.</p>\n<p>إعدادات الـ overlay تخصّ frame الـ overlay، لا الوصلة، فتعيد استخدامها كل الأزرار التي تفتح اللوحة. وداخل اللوحة، صِل Save habit وCancel بـ <strong>Close overlay</strong>.</p>\n<h2 id=\"sec-4\" tabindex=\"-1\">الـ Smart animate: مطابقة الطبقات</h2>\n<p>ينظر الـ Smart animate إلى frame-ين، ويجد الطبقات المتطابقة، ويحرّك الاختلافات. تتطابق الطبقة حين يكون لها <strong>الاسم نفسه</strong> وتقع في <strong>الموضع نفسه من شجرة الطبقات</strong> في الـ frame-ين. ويمكنه تحريك الموضع والحجم والدوران والشفافية والتعبئة.</p>\n<p>لاحتفال الـ streak في Habit detail، كرّر الـ frame (التكرار يُبقي الأسماء متطابقة)، ثم في الـ frame الثاني كبّر رقم الـ streak وأظهر تدريجيًا شارة “New best!”. صِل بينهما بـ Smart animate، مع Ease out، لمدّة 300 ms.</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>لا يستطيع الـ Smart animate إظهار طبقة مخفية بأيقونة العين تدريجيًا؛ فلا توجد شفافية يبدأ منها. أبقِ الشارة ظاهرة واضبط شفافيتها على 0% في الـ frame الأول. وإذا أعدت تسمية الشارة إلى <code dir=\"ltr\">Badge copy</code> في أحد الـ frame-ين أو نقلتها إلى group آخر، فسيرى الـ Smart animate طبقتين لا علاقة بينهما، وستظهر الشارة فجأة. الطبقات المسمّاة من الدرس 1.4 هي ما يجعل هذا يعمل.</p>\n</aside>\n<h2 id=\"sec-5\" tabindex=\"-1\">العرض والتمرير</h2>\n<p>اجعل Today نقطة بداية للمسار (flow starting point) واضغط زر التشغيل لتعرض الـ prototype. في قائمة طويلة، اضبط frame المحتوى على التمرير العمودي وأبقِ شريط التبويبات ثابتًا في مكانه، وكلاهما من تبويب Prototype وقت كتابة هذا الدرس. اختبر على هاتف حقيقي بتطبيق Figma للجوّال؛ فحركة مدّتها 300 ms تبدو بطيئة على الشاشة الكبيرة كثيرًا ما تبدو مناسبة في اليد.</p>\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>اصنع prototype للسؤال لا للتطبيق</span></p>\n<p>قبل أن تنشئ أي وصلة، اكتب ما تريد أن تتعلّمه: «هل يجد الناس زر الإضافة؟» أو «هل تسجيل العادة مُرضٍ؟». اصنع prototype للشاشات التي تجيب عن السؤال ولا شيء غيرها. الـ prototype المركّز من خمس شاشات يحصد ملاحظات أفضل من متاهة من أربعين شاشة.</p>\n</aside>\n<p>في الدرس التالي تتأكّد من أن الشاشات التي حرّكتها للتوّ تعمل للجميع، بمن فيهم من لا يرون التركوازي، ومن لا يستطيعون النقر على أهداف صغيرة، ومن يستخدمون قارئ الشاشة (screen reader).</p>\n","toc":[{"id":"sec-1","text":"التفاعلات: trigger وaction وحركة","level":2},{"id":"sec-2","text":"الـ Interactive components: زر التعليم","level":2},{"id":"sec-3","text":"الـ Overlays: لوحة New habit","level":2},{"id":"sec-4","text":"الـ Smart animate: مطابقة الطبقات","level":2},{"id":"sec-5","text":"العرض والتمرير","level":2}],"takeaways":["كل تفاعل في الـ prototype هو trigger (مثل On tap) مع action (مثل Navigate to أو Open overlay) مع حركة (animation).","الـ Interactive components تضع التفاعلات بين الـ variants داخل الـ component نفسه، فتتبدّل كل instance من زر التعليم وحدها.","الـ Overlays تعرض محتوى مثل اللوحة السفلية فوق الشاشة الحالية، مع إعدادات للموضع والإغلاق عند النقر خارجها والخلفية.","الـ Smart animate يطابق الطبقات بالاسم والموضع في شجرة الطبقات، ثم يحرّك الموضع والحجم والدوران والشفافية والتعبئة بينها.","اصنع prototype للّحظات التي تحتاج إلى اختبارها أو شرحها، لا لكل شاشة، وأبقِ كل مسار قصيرًا بما يكفي لإنهائه في دقيقة."],"further":[{"title":"Guide to prototyping in Figma","url":"https://help.figma.com/hc/en-us/articles/360040314193-Guide-to-prototyping-in-Figma"},{"title":"Prototype triggers","url":"https://help.figma.com/hc/en-us/articles/360040035834-Prototype-triggers"},{"title":"Smart animate layers between frames","url":"https://help.figma.com/hc/en-us/articles/360039818874-Smart-animate-layers-between-frames"},{"title":"Create overlays in your prototypes","url":"https://help.figma.com/hc/en-us/articles/360039818254-Create-overlays-in-your-prototypes"}],"quiz":[{"q":"<p>تريد أن يتبدّل زر التعليم في كل صف عادة بين To do وDone في الـ prototype، في كل شاشة. ما الإعداد الأكفأ؟</p>","options":[{"text":"ارسم وصلة من كل زر تعليم في كل شاشة إلى نسخة من تلك الشاشة يكون فيها الزر معلَّمًا.","why":"هذا يحتاج شاشة جديدة لكل تركيبة من الصفوف المعلَّمة، وينفجر العدد بسرعة."},{"text":"أضف تفاعل On tap مع Change to ‏Done بين الـ variants داخل الـ component set الخاص بـ Check button.","why":"صحيح. التفاعلات داخل الـ component تجعل كل instance تفاعلية، دون شاشات إضافية."},{"text":"استخدم After delay لتصبح الأزرار معلَّمة تلقائيًا.","why":"المختبِرون يحتاجون إلى النقر. التغيير الموقوت لا يختبر هل يجد الناس الزر."},{"text":"صدّر الشاشات وأضف التفاعلات في محرّر فيديو.","why":"الفيديو لا يستجيب للنقرات، فتخسر ما يجعل الـ prototype مفيدًا."}],"answer":1},{"q":"<p>يجب أن تنزلق لوحة New habit من الأسفل فوق شاشة Today وأن تُغلق حين ينقر أحدهم على المنطقة المعتمة. أيّ إعداد يناسب؟</p>","options":[{"text":"Navigate to إلى نسخة من Today مرسومة عليها اللوحة، باستخدام Instant.","why":"تبدو مشابهة، لكن لا يمكن إغلاق اللوحة بالنقر خارجها، وستضطرّ إلى صيانة شاشة Today ثانية."},{"text":"Scroll to إلى موضع اللوحة في frame طويل لشاشة Today.","why":"التمرير سيحرّك الشاشة كلها، لا أن يزلق لوحة فوقها."},{"text":"Open overlay مع frame اللوحة، في موضع أسفل المنتصف، مع خلفية خلفها وتفعيل الإغلاق عند النقر خارجها.","why":"صحيح. هذا بالضبط ما وُجدت الـ overlays من أجله، والإعدادات محفوظة على الـ overlay فتعيد استخدامها كل وصلة."},{"text":"Change to إلى variant من frame شاشة Today.","why":"Change to يعمل على variants الـ components، وشاشة Today ‏frame لا component set."}],"answer":2},{"q":"<p>في الـ frame الأول شارة الـ streak مخفية بأيقونة العين. وفي الثاني ظاهرة. الـ Smart animate يجعلها تظهر فجأة بدل أن تظهر تدريجيًا. ما الإصلاح؟</p>","options":[{"text":"زيادة المدّة إلى 2,000 ms.","why":"المدّة الأطول لا تفيد حين لا يوجد تغيير قابل للتحريك. الظهور يتبدّل فورًا."},{"text":"تغيير الحركة إلى Dissolve.","why":"‏Dissolve يُخفت الـ frame كله، لا الشارة وحدها."},{"text":"إعادة تسمية الشارة في الـ frame الثاني.","why":"الأسماء المختلفة ستمنع الـ Smart animate من مطابقتها أصلًا. يجب أن تكون الأسماء متطابقة."},{"text":"إبقاء الشارة ظاهرة في الـ frame-ين وضبط شفافيتها على 0% في الأول.","why":"صحيح. الـ Smart animate يحرّك قيم الشفافية، لكن الطبقة المخفية ليس لها شفافية يبدأ منها."}],"answer":3}],"exercise":{"kind":"choice","multiple":true,"options":["names-differ","parent-differs","instant","duration","easing","trigger"],"correct":["names-differ","parent-differs","instant"],"title":"لماذا يقفز الصف بدل أن ينزلق؟","prompt":"<p>حين تُعلَّم عادة، يجب أن ينزلق صفّها في Steady إلى الأسفل داخل مجموعة Done. لكن الـ prototype يقفز مباشرة من Frame A إلى Frame B. هذان هما الـ frame-ان، والوصلة، ومسار طبقة صف Read في كلٍّ منهما.</p>\n<p>:::figure frame-ان يجب أن يتحرّك بينهما Smart animate\n<svg viewBox=\"0 0 520 300\" role=\"img\" aria-labelledby=\"ex1\"></p>\n  <title id=\"ex1\">‏Frame A يعرض قائمة العادات وصف Read في أعلاها تحت To do. ‏Frame B يعرض صف Read وقد نزل إلى مجموعة Done منفصلة. سهم عليه On tap وInstant يصل بينهما. وأسماء الطبقات معروضة تحت كل frame.</title>\n  <rect class=\"d-box\" x=\"20\" y=\"20\" width=\"200\" height=\"200\" rx=\"16\"/>\n  <text class=\"d-label-strong\" x=\"36\" y=\"46\">Frame A</text>\n  <rect class=\"d-box-primary\" x=\"36\" y=\"60\" width=\"168\" height=\"34\" rx=\"8\"/>\n  <text class=\"d-label\" x=\"48\" y=\"82\">Read</text>\n  <rect class=\"d-box\" x=\"36\" y=\"102\" width=\"168\" height=\"34\" rx=\"8\"/>\n  <text class=\"d-label\" x=\"48\" y=\"124\">Water</text>\n  <rect class=\"d-box\" x=\"300\" y=\"20\" width=\"200\" height=\"200\" rx=\"16\"/>\n  <text class=\"d-label-strong\" x=\"316\" y=\"46\">Frame B</text>\n  <rect class=\"d-box\" x=\"316\" y=\"60\" width=\"168\" height=\"34\" rx=\"8\"/>\n  <text class=\"d-label\" x=\"328\" y=\"82\">Water</text>\n  <rect class=\"d-box-success d-dashed\" x=\"310\" y=\"120\" width=\"180\" height=\"70\" rx=\"10\"/>\n  <rect class=\"d-box-primary\" x=\"316\" y=\"142\" width=\"168\" height=\"34\" rx=\"8\"/>\n  <text class=\"d-label\" x=\"328\" y=\"164\">Read</text>\n  <path class=\"d-arrow\" d=\"M222 120 L298 120\" marker-end=\"url(#arrow)\"/>\n  <text class=\"d-label-muted\" x=\"260\" y=\"110\" text-anchor=\"middle\">On tap</text>\n  <text class=\"d-label-muted\" x=\"260\" y=\"140\" text-anchor=\"middle\">Instant</text>\n  <text class=\"d-code\" x=\"20\" y=\"250\">List / Read row</text>\n  <text class=\"d-code\" x=\"300\" y=\"250\">List / Done group /</text>\n  <text class=\"d-code\" x=\"300\" y=\"272\">  Habit row/Read</text>\n</svg>\n:::\n<p>اختر <strong>كل</strong> سبب يمنع الصف من الانزلاق.</p>\n","hints":["الـ Smart animate يحتاج طبقة مطابقة: الاسم نفسه، والموضع نفسه في شجرة الطبقات. قارن المسارين.","انظر أيضًا إلى الحركة المضبوطة على الوصلة.","ثلاثة أسباب: الاسم، والأب، ونوع الحركة."],"explanation":"<p>الوصلة تستخدم <strong>Instant</strong>، فلا شيء يمكن أن يتحرّك حتى لو كانت الطبقات مثالية؛ غيّرها إلى <strong>Smart animate</strong>. ثم يظلّ الـ Smart animate بحاجة إلى تطابق: الصف اسمه <code dir=\"ltr\">Read row</code> في Frame A و<code dir=\"ltr\">Habit row/Read</code> في Frame B (<strong>اسمان مختلفان</strong>)، وفي Frame B يقع داخل <code dir=\"ltr\">Done group</code> (<strong>أب مختلف</strong>). أعطه الاسم نفسه وأبقِه في الأب نفسه في الـ frame-ين، مثلًا بالإبقاء على قائمة واحدة وتغيير موضع الصف، أو بتحريك عنوان Done بدلًا منه. المدّة والـ easing والـ trigger ‏On tap كلها سليمة؛ فهي تغيّر طريقة تحريك الطبقات المتطابقة، لا وجود التطابق نفسه.</p>\n","checkLabels":{},"optionText":{"names-differ":{"text":"الصف له اسمان مختلفان في الـ frame-ين.","why":"صحيح. الـ Smart animate يطابق الطبقات بالاسم، فـ <code dir=\"ltr\">Read row</code> و<code dir=\"ltr\">Habit row/Read</code> طبقتان لا علاقة بينهما."},"parent-differs":{"text":"في Frame B يقع الصف داخل group أب مختلف.","why":"صحيح. التطابق يعتمد أيضًا على موضع الطبقة في شجرة الطبقات. والأب الجديد يكسر المطابقة."},"instant":{"text":"حركة الوصلة مضبوطة على Instant.","why":"صحيح. ‏Instant لا يحرّك شيئًا أبدًا. يجب اختيار Smart animate في التفاعل."},"duration":{"text":"يجب أن تكون المدّة 1,000 ms على الأقل.","why":"المدّة تغيّر سرعة حركة تحدث بالفعل فقط. ومدّة بين 250 و300 ms تناسب تحريك صف."},"easing":{"text":"يجب أن يكون الـ easing ‏Linear بدل Ease out.","why":"الـ easing يشكّل الحركة؛ ولا يحدّد هل تتطابق الطبقات. ‏Ease out خيار افتراضي جيد للعناصر التي تستقرّ في مكانها."},"trigger":{"text":"يجب أن يكون الـ trigger ‏On click بدل On tap.","why":"On click وOn tap هما الـ trigger نفسه، بتسميتين لسطح المكتب والجوّال."}}},"words":703,"readMinutes":4}