{"id":"l-a11y-5-3","courseId":"web-accessibility","lang":"ar","kind":"lesson","summary":"نفّذ تدقيقًا منظّمًا وفق WCAG 2.2 AA لصفحة أو مسار كامل، ورتّب ما تجده بحسب الأولوية، وأدمج إمكانية الوصول في التصميم والتطوير وضمان الجودة لتبقى مُصلَحة.","html":"<p>على مدى سبعة عشر درسًا أصلحت Ticketly شريحةً بعد شريحة. والتدقيق هو الطريقة التي تثبت بها أن الكل يعمل، وتجد بها ما انزلق بين الشرائح. ثم تأتي المشكلة الأصعب: أن يبقى كذلك حين يغيّره خمسة مطوّرين ومصمّمان وفريق تسويق كل أسبوع.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">تدقيق منظّم</h2>\n<p>تعطي منهجية التقييم الصادرة عن W3C، <strong>WCAG-EM</strong>، الشكل العام. وهذا تطبيقها على Ticketly:</p>\n<ol>\n<li><strong>النطاق والهدف.</strong> «تطبيق Ticketly على الويب، WCAG 2.2 بالمستوى AA، أحدث إصدارات Chrome وFirefox وSafari، وNVDA وVoiceOver.» كتابة ذلك تمنع التدقيق من التشعّب، أو من تخطّي الأجزاء الصعبة بصمت.</li>\n<li><strong>الاستكشاف واختيار العيّنة.</strong> اسرد المسارات الأساسية: إيجاد فعالية، وحجز التذاكر، والدفع، وإدارة الحجز. اختر صفحات تمثيلية، وأدرج كل <strong>عملية كاملة</strong> من أولها إلى آخرها. يشمل التوافق مع WCAG العمليات كاملةً، وكثير من الإخفاقات، مثل ضياع التركيز بعد خطوة أو طلب البريد الإلكتروني مرة أخرى، لا تظهر إلا بين الصفحات.</li>\n<li><strong>الفحص الآلي.</strong> شغّل axe على كل صفحة <strong>وحالة</strong> في العيّنة: نوافذ حوار مفتوحة، وقوائم موسَّعة، ونماذج تُظهر أخطاء، والسمة الداكنة مفعّلة. أصلح النتائج أو سجّلها؛ فهي الرخيصة.</li>\n<li><strong>جولة لوحة المفاتيح.</strong> كل مسار، دون فأرة، باستخدام قائمة الفحص من درس <a href=\"/ar/lesson/web-accessibility/l-a11y-5-2\">الاختبار بلوحة المفاتيح وقارئات الشاشة</a>.</li>\n<li><strong>جولة قارئ الشاشة.</strong> المسارات نفسها مع NVDA وChrome، وVoiceOver وSafari، وVoiceOver على iOS للتخطيط الخاص بالهاتف.</li>\n<li><strong>الفحوص البصرية وفحوص المحتوى.</strong> تكبير 400% وإعادة التدفّق عند 320px، والتباعد النصي، والتباين غير النصي، وتقليل الحركة، وجودة النص البديل، والعناوين، ونصوص الروابط، ولغة الأجزاء.</li>\n<li><strong>التقرير وترتيب الأولويات.</strong> كل ملاحظة مع موقعها، وخطواتها، ومعيار WCAG، ودرجة الخطورة، واقتراح للإصلاح.</li>\n<li><strong>الإصلاح وإعادة الاختبار</strong> للمسارات نفسها، ثم تحديث بيان إمكانية الوصول.</li>\n</ol>\n<figure class=\"diagram\"><svg class=\"diagram-svg\" focusable=\"false\" viewBox=\"0 0 700 170\" role=\"img\" aria-labelledby=\"l-a11y-5-3-t1\"><defs><marker id=\"arrow-l-a11y-5-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-a11y-5-3-t1\">أربع مراحل في صفّ واحد: النطاق والعيّنة، ثم الفحص الآلي للصفحات والحالات، ثم الجولات اليدوية بلوحة المفاتيح وقارئات الشاشة والتكبير والمحتوى، ثم التقرير والإصلاح وإعادة الاختبار، مع سهم يعود من إعادة الاختبار إلى الجولات اليدوية.</title>\n  <rect class=\"d-box\" x=\"10\" y=\"45\" width=\"150\" height=\"70\" rx=\"10\"/>\n  <text class=\"d-label\" x=\"85\" y=\"75\" text-anchor=\"middle\">النطاق +</text>\n  <text class=\"d-label\" x=\"85\" y=\"97\" text-anchor=\"middle\">العيّنة</text>\n  <path class=\"d-arrow\" d=\"M160 80 L185 80\" marker-end=\"url(#arrow-l-a11y-5-3-1)\"/>\n  <rect class=\"d-box-accent\" x=\"190\" y=\"45\" width=\"150\" height=\"70\" rx=\"10\"/>\n  <text class=\"d-label\" x=\"265\" y=\"75\" text-anchor=\"middle\">فحص آلي</text>\n  <text class=\"d-label\" x=\"265\" y=\"97\" text-anchor=\"middle\">صفحات + حالات</text>\n  <path class=\"d-arrow\" d=\"M340 80 L365 80\" marker-end=\"url(#arrow-l-a11y-5-3-1)\"/>\n  <rect class=\"d-box-primary\" x=\"370\" y=\"45\" width=\"150\" height=\"70\" rx=\"10\"/>\n  <text class=\"d-label\" x=\"445\" y=\"75\" text-anchor=\"middle\">يدوي: مفاتيح،</text>\n  <text class=\"d-label\" x=\"445\" y=\"97\" text-anchor=\"middle\">قارئ، تكبير، نص</text>\n  <path class=\"d-arrow\" d=\"M520 80 L545 80\" marker-end=\"url(#arrow-l-a11y-5-3-1)\"/>\n  <rect class=\"d-box-success\" x=\"550\" y=\"45\" width=\"140\" height=\"70\" rx=\"10\"/>\n  <text class=\"d-label\" x=\"620\" y=\"75\" text-anchor=\"middle\">تقرير، إصلاح،</text>\n  <text class=\"d-label\" x=\"620\" y=\"97\" text-anchor=\"middle\">إعادة اختبار</text>\n  <path class=\"d-arrow d-dashed\" d=\"M620 115 C620 160 445 160 445 120\" marker-end=\"url(#arrow-l-a11y-5-3-1)\"/>\n  <text class=\"d-label-muted\" x=\"530\" y=\"160\" text-anchor=\"middle\">أعِد اختبار المسارات نفسها</text>\n</svg><figcaption>تدقيق Ticketly، من النطاق إلى إعادة الاختبار</figcaption></figure>\n<h2 id=\"sec-2\" tabindex=\"-1\">ترتيب ما تجده بحسب الأولوية</h2>\n<p>كثيرًا ما يسرد التدقيق الأول لمنتج حقيقي عشرات المشكلات أو مئاتها. رتّبها بحسب ما تفعله بالناس:</p>\n<ul>\n<li><strong>حرجة (Critical):</strong> تمنع بعض المستخدمين من إتمام مهمة أساسية. حقل رقم بطاقة بلا label، أو مصيدة لوحة مفاتيح في نافذة الدفع، أو CAPTCHA بلا بديل.</li>\n<li><strong>خطيرة (Serious):</strong> المهمة ممكنة لكنها صعبة جدًا. عناوين مفقودة في صفحة طويلة، أو أخطاء لا تُعلَن.</li>\n<li><strong>متوسطة (Moderate):</strong> احتكاك وارتباك. نصوص روابط مبهمة، أو تباين منخفض في النصوص الثانوية.</li>\n<li><strong>طفيفة (Minor):</strong> لمسات أخيرة. أيقونة زخرفية تُعلَن على أنها “graphic”.</li>\n</ul>\n<p>ثم زِنها بحسب حجم الزيارات والمسار: مشكلة خطيرة في صفحة الدفع أهمّ من مشكلة متوسطة في صفحة الوظائف. وإصلاح عشر مشكلات حرجة في مسار الحجز يفعل للعملاء ذوي الإعاقة أكثر مما يفعله إصلاح مئة مشكلة طفيفة في أماكن أخرى.</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>إصلاح الحالة الواحدة بدلًا من الـ component</span></p>\n<p>يقول التدقيق: «زر Book now في بطاقة الجمعة ليس له اسم فريد». فيُصلح أحدهم ذلك الزر وحده. وهناك 240 بطاقة فعالية، كلها يعرضها الـ component نفسه. اسأل دائمًا من أين تأتي المشكلة، وأصلحها في الـ component أو الـ token أو القالب المشترك، ليصل الإصلاح إلى كل الصفحات دفعة واحدة.</p>\n</aside>\n<h2 id=\"sec-3\" tabindex=\"-1\">دمجها في عمل الفريق</h2>\n<p>عمليات التدقيق تجد المشكلات بعد بنائها. أما إمكانية الوصول الدائمة فتأتي من التقاط المشكلات في كل مرحلة، عند النقطة التي يكون إصلاحها فيها أرخص.</p>\n<p><strong>التصميم.</strong> أرفِق بالتصاميم ملاحظات بالمعلومات التي لا يستطيع المطوّرون رؤيتها في صورة: بنية العناوين، والـ landmarks، وترتيب التركيز، والأسماء المتاحة لأزرار الأيقونات، ورسائل الخطأ، وما يتحرّك وبديله عند تقليل الحركة. تحقّق من tokens الألوان مقابل نسب التباين مرة واحدة، لترثها كل الشاشات. وصمّم حالات التركيز والخطأ، لا الحالة الافتراضية وحالة التمرير فقط.</p>\n<p><strong>الـ Components.</strong> مكتبة الـ components المشتركة أكبر رافعة لديك. إن كانت components مثل <code dir=\"ltr\">Dialog</code> و<code dir=\"ltr\">Tabs</code> و<code dir=\"ltr\">Button</code> و<code dir=\"ltr\">TextField</code> سهلة الوصول، فكل ميزة تُبنى منها تبدأ سهلة الوصول، والإصلاح في مكان واحد يُصلح كل شيء.</p>\n<p><strong>التطوير.</strong> استخدم <code dir=\"ltr\">eslint-plugin-jsx-a11y</code> للـ linting، وشغّل axe في اختبارات الـ components والاختبارات الشاملة، واجعل فحص لوحة المفاتيح لمدة دقيقتين جزءًا من كل pull request. وتحديد العناصر بالدور والاسم في الاختبارات، كما يشجّع Playwright وTesting Library، يُبقي الأسماء صادقة.</p>\n<p><strong>ضمان الجودة وتعريف الإنجاز.</strong> لا تكون القصة (story) منجزة حتى تعمل بلوحة المفاتيح وتُفحص بقارئ شاشة واحد على الأقل. وأخطاء إمكانية الوصول مكانها الـ backlog العادي بدرجات خطورة عادية؛ فالقائمة المنفصلة تميل إلى أن تصبح القائمة التي لا يجدولها أحد.</p>\n<p><strong>المحتوى والمشتريات.</strong> المحرّرون يكتبون النصوص البديلة والنصوص بلغة بسيطة؛ فدرّبهم، واجعل حقل alt إلزاميًا في نظام إدارة المحتوى (CMS). وحين تشتري widgets من أطراف ثالثة، مثل نموذج دفع أو أداة محادثة، فاطلب تقرير توافق إمكانية الوصول (Accessibility Conformance Report) واختبرها بنفسك، لأن عوائقها تصبح عوائقك.</p>\n<aside class=\"callout callout-why\" 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\"/><circle cx=\"12\" cy=\"12\" r=\"6\"/><circle cx=\"12\" cy=\"12\" r=\"2\"/></svg><span><span class=\"callout-kind\">لماذا يهمّ هذا</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>لماذا يهمّ هذا</span></p>\n<p>يشترط قانون إمكانية الوصول الأوروبي وقوانين مشابهة أن تصف كيف تحقّق خدمتك متطلّبات إمكانية الوصول، وهذا يعني عمليًا نشر بيان إمكانية الوصول (accessibility statement). والبيان الصادق الذي يسرد المشكلات المعروفة ويوفّر جهة اتصال للمساعدة أفضل بكثير من ادّعاء توافق كامل لم يختبره أحد. والمستخدمون الذين لديهم طريقة للإبلاغ عن المشكلات يصبحون أفضل مختبِريك.</p>\n</aside>\n<h2 id=\"sec-4\" tabindex=\"-1\">أين انتهى Ticketly</h2>\n<p>صار لـ Ticketly الآن landmarks ومخطّط عناوين، وأزرار وروابط حقيقية، ونماذج لها labels وأخطاء تُعلَن، ونصوص بديلة مدروسة، وجدول أسعار سليم. يعمل من لوحة المفاتيح مع رابط تخطٍّ وتركيز مرئي، وفيه نافذة حجز أصلية، وتبويبات ARIA، ورسائل حالة حيّة، وينجح في التباين، ويُعاد تدفّقه عند تكبير 400%، ويحترم تقليل الحركة، ويسمّي كل عنصر تحكّم، وينطق محتواه العربي بشكل صحيح. والأهم من ذلك كله أن فيه axe ضمن الـ CI، وفريقًا يفحص بلوحة المفاتيح قبل الدمج.</p>\n<p>حجز سمير تذاكره لمهرجان Harbour Lights بنفسه هذا العام، في أقل من دقيقتين، دون أن يتصل بأحد. وهذا هو المقصود من كل ما سبق.</p>\n","toc":[{"id":"sec-1","text":"تدقيق منظّم","level":2},{"id":"sec-2","text":"ترتيب ما تجده بحسب الأولوية","level":2},{"id":"sec-3","text":"دمجها في عمل الفريق","level":2},{"id":"sec-4","text":"أين انتهى Ticketly","level":2}],"takeaways":["للتدقيق نطاق وهدف محدّدان، وعيّنة تمثيلية تشمل مسارات كاملة، واختبار آلي ويدوي، وتقرير مرتّب بحسب الأولوية.","رتّب الأولويات بحسب الأثر في المهام الحقيقية؛ فعائق واحد في صفحة الدفع أهمّ من دزينة مشكلات صغيرة في صفحة «من نحن».","تدوم إمكانية الوصول حين تكون جزءًا من كل مرحلة، من ملاحظات التصميم والـ components سهلة الوصول إلى قواعد الـ lint وفحوص الـ CI وتعريف الإنجاز (definition of done).","أخطاء إمكانية الوصول أخطاء؛ أبقِها في الـ backlog العادي بدرجات خطورة عادية، لا في قائمة منفصلة لا تُجدوَل أبدًا."],"further":[{"title":"W3C WAI: WCAG-EM Overview (Website Accessibility Conformance Evaluation Methodology)","url":"https://www.w3.org/WAI/test-evaluate/conformance/wcag-em/"},{"title":"W3C WAI: Planning and Managing Web Accessibility","url":"https://www.w3.org/WAI/planning-and-managing/"},{"title":"W3C WAI: Developing an Accessibility Statement","url":"https://www.w3.org/WAI/planning/statements/"}],"quiz":[{"q":"<p>وجد تدقيقك لـ Ticketly ‏60 مشكلة ولديك sprint واحد. أيّها يجب أن يُصلَح أولًا؟</p>","options":[{"text":"روابط التذييل الثلاثون منخفضة التباين، لأنها الأكثر عددًا","why":"الكثرة ليست هي الأثر. روابط التذييل نادرًا ما تكون السبب في عجز أحد عن شراء تذكرة."},{"text":"كل ما أبلغ عنه axe، لأن النتائج الآلية هي الأكثر موضوعية","why":"بعض أخطر المشكلات، مثل مصيدة تركيز في صفحة الدفع، لا يبلّغ عنها axe أبدًا. رتّب الأولويات بحسب الأثر، لا بحسب المصدر."},{"text":"مشكلات صفحة «من نحن»، لأنها الأسهل وتُظهر تقدّمًا سريعًا","why":"للمكاسب السريعة مكانها، لكن ترك صفحة الدفع معطوبة يعني أن العملاء ذوي الإعاقة ما زالوا عاجزين عن إتمام الشراء."},{"text":"حقل رقم البطاقة بلا label، ومصيدة لوحة المفاتيح في نافذة الدفع، لأنهما يمنعان الشراء","why":"صحيح. العوائق في أهمّ المسارات تأتي أولًا؛ فهي تمنع الناس من إتمام المهمة أصلًا."}],"answer":3},{"q":"<p>لماذا يجب أن تشمل عيّنة التدقيق عمليات كاملة، مثل مسار الحجز كله، لا صفحات منفردة فقط؟</p>","options":[{"text":"لأن التوافق مع WCAG يشترط أن تتوافق كل صفحة في العملية، والإخفاقات كثيرًا ما تظهر بين الخطوات","why":"صحيح. اشتراطات التوافق في WCAG تشمل العمليات الكاملة، وإدارة التركيز والتعافي من الأخطاء وتكرار الإدخال لا تظهر إلا حين تمرّ عبرها."},{"text":"لأن الأدوات الآلية لا تستطيع فحص إلا المسارات متعدّدة الصفحات","why":"الأدوات الآلية تفحص صفحات وحالات منفردة. المسارات مهمة بسبب ما يمرّ به الإنسان بين الخطوات."},{"text":"لأن الصفحات المنفردة سهلة الوصول دائمًا","why":"الصفحات المنفردة تفشل طوال الوقت. الفكرة أن اختبار الصفحات وحدها يفوّت مشكلات لا تظهر إلا عبر مسار."}],"answer":0},{"q":"<p>أيّ ممارسة تفعل أكثر من غيرها لإبقاء Ticketly سهل الوصول مع إطلاق ميزات جديدة؟</p>","options":[{"text":"تدقيق خارجي كامل كل سنتين","why":"عمليات التدقيق نقاط تفتيش قيّمة، لكن سنتين من التغييرات غير المفحوصة ستعيد معظم المشكلات."},{"text":"إمكانية الوصول ضمن تعريف الإنجاز، مع components مشتركة سهلة الوصول، وaxe في الـ CI، وفحص بلوحة المفاتيح قبل الدمج","why":"صحيح. حين تمرّ كل ميزة عبر البوّابات نفسها، تُصان إمكانية الوصول باستمرار بدلًا من أن تُرمَّم دوريًا."},{"text":"«backlog لإمكانية الوصول» منفصل يُراجَع في نهاية كل ربع سنة","why":"الـ backlog المنفصل يوحي بأن هذه إضافات اختيارية ويميل إلى أن يُؤجَّل. أخطاء إمكانية الوصول مكانها الـ backlog العادي."}],"answer":1}],"exercise":{"kind":"order","items":["scope","sample","automated","keyboard","screen-reader","visual-content","report","retest"],"title":"خطّط لتدقيق Ticketly","prompt":"<p>طُلب منك تدقيق Ticketly وفق WCAG 2.2 AA قبل إطلاق بيع تذاكر المهرجان. رتّب خطوات التدقيق بالترتيب الذي ستنفّذها به.</p>\n","hints":["لا يمكنك اختيار الصفحات قبل أن تعرف المعيار الذي تدقّق وفقه وأيّ المسارات مهمة.","أجرِ الفحوص الآلية الرخيصة والسريعة قبل الجولات اليدوية الأبطأ، حتى لا تشتّت الـ labels المفقودة انتباه المختبِرين اليدويين.","تنتهي الاختبارات بجولة على الفحوص البصرية وفحوص المحتوى التي لا تغطّيها الأداة الآلية ولا الجولتان اليدويتان. ويأتي التقرير بعد انتهاء كل الاختبارات، ولا ينتهي العمل حتى يُعاد اختبار الإصلاحات."],"explanation":"<p>يبدأ التدقيق بتحديد <strong>نطاقه وهدفه</strong>، ليتّفق الجميع على معنى «الانتهاء». ثم تختار <strong>العيّنة</strong> صفحات تمثيلية ومسارات كاملة. وتأتي <strong>الفحوص الآلية</strong> أولًا بين الاختبارات لأنها سريعة وتزيل المشكلات الواضحة. وتسبق <strong>جولةُ لوحة المفاتيح</strong> <strong>جولةَ قارئ الشاشة</strong> لأن إخفاقات لوحة المفاتيح (عناصر لا يمكن الوصول إليها، ومصائد) تعيق اختبار قارئ الشاشة أيضًا. وتغطّي <strong>الفحوص البصرية وفحوص المحتوى</strong> ما لا تكشفه أيٌّ من الأداتين. ويرتّب <strong>التقرير</strong> الأولويات بحسب الأثر، وتنغلق الدورة بالإصلاحات، و<strong>إعادة اختبار</strong> المسارات نفسها، وتحديث بيان إمكانية الوصول.</p>\n","checkLabels":{},"itemText":{"scope":"الاتفاق على النطاق والهدف: WCAG 2.2 AA، والمتصفّحات والتقنيات المساعدة، والمسارات الأساسية","sample":"اختيار عيّنة: الصفحة الرئيسية، وصفحة الفعالية، وصفحات الدفع والحساب، إضافةً إلى مسار الحجز كاملًا","automated":"تشغيل axe على كل صفحة وحالة في العيّنة، بما فيها نوافذ الحوار المفتوحة وأخطاء النماذج","keyboard":"إجراء جولة بلوحة المفاتيح عبر كل مسار: الوصول، والرؤية، والتشغيل، والخروج","screen-reader":"تكرار المسارات مع NVDA وChrome، وVoiceOver وSafari، وVoiceOver على iOS","visual-content":"فحص تكبير 400%، والتباعد النصي، وتقليل الحركة، وجودة النص البديل، والعناوين، واللغة","report":"كتابة الملاحظات مع الموقع ومعيار WCAG ودرجة الخطورة والإصلاح، وتقديم العوائق في المسارات الأساسية","retest":"إصلاح المشكلات، وإعادة اختبار المسارات نفسها، وتحديث بيان إمكانية الوصول"}},"words":832,"readMinutes":5}