واجهات متقنة: الثيم والتباعد وإمكانية الوصول
من واجهةٍ تعمل إلى واجهةٍ محترفة ومتاحة. ⏱ نحو 40 دقيقة.
- تبني نظام تصميمٍ صغيرًا (ألوان، تباعد، حوافّ).
- تضمن مساحات لمسٍ مريحة.
- تحسّن إمكانية الوصول بـ
accessibility.
١ما الذي يجعل الواجهة «متقنة»؟
الفرق بين واجهةٍ عاديّة وأخرى محترفة ليس الألوان الزاهية، بل الاتّساق: نظام ألوانٍ وتباعدٍ موحّد، ومساحات لمسٍ مريحة، وإتاحةٌ لكل المستخدمين.
| المبدأ | التطبيق |
|---|---|
نظام ألوان (Tokens) | عرّف الألوان مرّةً واستخدم أسماءها |
| سلّم تباعد | استخدم مضاعفات 4 أو 8 (8، 16، 24) |
| مساحة لمس | لا تقلّ عن 44×44 نقطة |
| إمكانية الوصول | accessibilityLabel للعناصر المهمّة |
٢نظام تصميمٍ صغير
نجمع الألوان والتباعد في كائنٍ واحد (نظام تصميم)، فتصبح الواجهة متّسقةً وسهلة التغيير:
import { View, Text, StyleSheet } from 'react-native'; const T = { color: { brand: '#E8820C', ink: '#1A202C', muted: '#718096', card: '#FFF8F0' }, space: { sm: 8, md: 16, lg: 24 }, radius: 14,}; export default function App() { return ( <View style={{ padding: T.space.lg }}> <View style={styles.card}> <Text style={styles.title}>بطاقة متقنة</Text> <Text style={styles.body}>ألوانٌ وتباعدٌ من نظامٍ واحد، فكل شيءٍ متناغم.</Text> </View> </View> );} const styles = StyleSheet.create({ card: { backgroundColor: T.color.card, padding: T.space.md, borderRadius: T.radius }, title: { color: T.color.brand, fontSize: 20, fontWeight: 'bold', marginBottom: T.space.sm }, body: { color: T.color.muted, lineHeight: 22 },});
كائن T مصدرٌ واحد للحقيقة. لتغيير الهويّة تعدّل مكانًا واحدًا، فتتبعه الواجهة كلّها.
٣إمكانية الوصول
بعض المستخدمين يعتمدون على قارئ الشاشة. نضيف accessibilityLabel وaccessibilityRole لتصبح العناصر مفهومةً صوتيًّا، ونضمن مساحة لمسٍ كافية:
import { View, Text, Pressable, StyleSheet } from 'react-native'; export default function App() { return ( <View style={{ padding: 20, gap: 12 }}> <Text accessibilityRole="header" style={styles.h}>الإعدادات</Text> <Pressable accessibilityRole="button" accessibilityLabel="تفعيل الإشعارات" style={styles.btn} > <Text style={styles.bt}>🔔 الإشعارات</Text> </Pressable> </View> );} const styles = StyleSheet.create({ h: { fontSize: 22, fontWeight: 'bold' }, btn: { minHeight: 48, justifyContent: 'center', paddingHorizontal: 16, backgroundColor: '#E8820C', borderRadius: 12 }, bt: { color: 'white', fontSize: 16 },});
accessibilityRole="header" يجعله عنوانًا لقارئ الشاشة. minHeight: 48 يضمن مساحة لمسٍ مريحة.
توقّع وتحقّق
ما الذي يجعل الواجهة متقنة أكثر؟
سلّم التباعد الجيّد يعتمد:
أقلّ مساحة لمسٍ مريحة:
لإتاحة العنصر لقارئ الشاشة:
الخلاصة
- الإتقان = اتّساق: نظام ألوانٍ وتباعدٍ موحّد.
- مساحة اللمس لا تقلّ عن 44 نقطة.
accessibilityLabel/Roleتجعل الواجهة متاحةً للجميع.
تحدٍّ برمجي: زرّ متاح
متوسطاصنع زرًّا بمساحة لمسٍ كافية ووصفٍ للوصول.
PressableبـaccessibilityRole="button"وaccessibilityLabel.- ارتفاعٌ لا يقلّ عن 44 (
minHeight). - داخله
<Text testID="label">نصّه «حفظ».
👀 اعرض الناتج المطلوب (وجرّبه)
- الكود يعمل بلا أخطاء في Console
- النصّ «حفظ»
- وصفٌ للوصول
- مساحة لمسٍ كافية
💡 تلميح 1
💡 تلميح 2
minHeight: 48 يضمن مساحة لمسٍ مريحة.حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
import { View, Text, Pressable, StyleSheet } from 'react-native'; export default function App() { return ( <View style={{ padding: 20 }}> <Pressable accessibilityRole="button" accessibilityLabel="حفظ التغييرات" style={styles.btn}> <Text testID="label" style={styles.t}>حفظ</Text> </Pressable> </View> );} const styles = StyleSheet.create({ btn: { minHeight: 48, justifyContent: 'center', alignItems: 'center', backgroundColor: '#E8820C', borderRadius: 12 }, t: { color: 'white', fontSize: 16 },});