التنبيه
Alertrole="alert"
اسمه كمانألرت، تنبيه مضمّن، شريط تنبيه، بانر، تنويه، صندوق ملاحظة، inline alert، banner، callout، admonition، notice box، message bar
التنبيه رسالة تأخذ مكانها داخل تخطيط الصفحة وتبقى فيه حتى يزيلها سبب واضح: تصحيح الخطأ أو ضغطة على زرّ الإغلاق. التنبيه المضمّن (inline alert) يوضَع في تدفّق المحتوى ملاصقاً للشيء الذي يتحدّث عنه، كالسطر تحت حقل البريد الذي يقول إن الصيغة غير صحيحة. والشريط (banner) يمتدّ في أعلى الصفحة أو أعلى قسم منها. وهو يخصّ الشاشة كلها لا عنصراً بعينه، ويبقى حتى يغلقه المستخدم. والتنويه (callout) نصّ تحريري داخل مقال أو صفحة توثيق: ملاحظة أو تحذير لا يقف خلفه إجراء من المستخدم. وليس أيّ من الثلاثة إشعاراً عائماً (toast)، لأن الإشعار العائم يطفو فوق الصفحة ويحمل مؤقّتاً يمحوه، بينما التنبيه يحجز مساحته في التخطيط ويزيح ما تحته. وليس أيّ منها نافذة حوارية (modal)، فالنافذة تحجب الصفحة وتنتظر قراراً، أمّا التنبيه فيترك المستخدم يواصل عمله ويتجاهله إن شاء.
لو قلت عليه…
العيّنة الحيّة
تفاعل مع الديمو. كل الأجزاء حقيقية ومرقّمة.
اشتراك الفريق ينتهي بعد ٣ أيام. جدّده من صفحة الفوترة.
تنويه: تغيير الاسم لا يغيّر رابط المساحة.
تشريح العنصر: كل جزء واسمه
مرّر على أي سطر ليتحدّد مكانه في الديمو فوق.
برومبت البناء
سلوكه في الاتجاه من اليمين لليسار
الجزء ده حصري عندنا.
الحافّة الملوّنة
ينعكسالخطّ الملوّن الذي يعرّف نوع التنبيه يجلس عند البداية المنطقية، أي عند اليمين في العربية. اكتبه border-inline-start: 3px solid وقابله بـ padding-inline-start، فـ border-left مع padding-left يبقيان في اليسار بعد الانعكاس ويلتصق النصّ بالحافّة اليمنى بلا حشو. ولو رسمت الخطّ بظلّ داخلي فتذكّر أن box-shadow بلا صيغة منطقية أصلاً: القيمة inset 3px 0 0 تزيح الظلّ يميناً فيظهر الشريط على الحافّة الداخلية اليسرى مهما كان اتجاه الصفحة، فاضرب الإزاحة في متغيّر اتجاه بالشكل inset calc(3px * var(--dir)) 0 0 مع ضبط --dir: -1 داخل [dir="rtl"].
صفّ الأيقونة والإغلاق
ينعكسالأيقونة عند البداية المنطقية، ثم النصّ، ثم زرّ الإغلاق عند النهاية المنطقية. صفّ flex عادي يرتّب نفسه لأن المحور المضمّن يتبع direction، فيكفيك gap مع margin-inline-start: auto على زرّ الإغلاق. وإن كان الزرّ مثبّتاً بالإحداثيات في شريط عريض فاكتب inset-inline-end: 12px لا right: 12px. ولا تضف flex-direction: row-reverse داخل [dir="rtl"] ظنّاً أنك تصحّح الترتيب، فالصفّ انعكس مرّة واحدة أصلاً، والعكس الثاني يجعل الترتيب البصري مخالفاً لترتيب DOM ولمسار Tab.
أيقونات الحالة لا تنقلب
لا ينعكسمثلّث التحذير، وعلامة التعجّب، وحرف i داخل الدائرة، وعلامة الصح: معناها واحد في الاتجاهين، وإن كُتبت محارف نصّية لا svg فقيمة Bidi_Mirrored فيها No، فلا يقلبها محرّك النصّ هو الآخر. والقاعدة الشاملة [dir="rtl"] svg { transform: scaleX(-1) } تكسر هذه الأيقونات بالذات وتعرضها مقلوبة بلا سبب. أمّا سهم «عرض التفاصيل» داخل التنبيه فهو اتجاهي ويجب أن ينقلب، فاقصر التحويل على صنف تضعه على الأسهم وحدها.
المقاطع اللاتينية داخل الرسالة
لا ينعكسرسائل الأخطاء مليئة بمقاطع لاتينية: اسم ملفّ، عنوان بريد، رمز مثل ERR_502. وإدخال أيّ منها في جملة عربية يجعل خوارزمية bidi تعيد ترتيب النقطة أو القوسين حوله، فتقفز النقطة إلى أوّل السطر أو ينفصل الرمز عن حدّيه. اعزل كل مقطع بـ <bdi> أو بسمة dir="ltr"، فورقة الأنماط الافتراضية في HTML تعطي الاثنين unicode-bidi: isolate. أمّا صنف CSS يحمل direction: ltr وحده فلا يعزل شيئاً: الاتجاه يضبط قاعدة المقطع، والعزل هو ما يمنع المحارف المحايدة حوله من الانضمام إليه، فأضف unicode-bidi: isolate معه.
الشريط المحقون خارج الشجرة
ينعكسالشريط العلوي يُحقن كثيراً في نهاية <body> عبر portal، والخصائص المنطقية تُحسب من قيمة direction المحسوبة للعنصر نفسه، وهي قيمة موروثة عبر شجرة DOM لا عبر شجرة React. فإن كانت dir="rtl" موضوعة على <div id="app"> بدلاً من <html>، خرج الشريط من تلك الشجرة وحُسب اتجاهه ltr، فرُسمت border-inline-start على اليسار و inset-inline-end على اليمين رغم أن كل سطر في الأنماط منطقيّ. ضع dir على <html>، أو مرّر dir صراحةً إلى حاوية الـ portal.
أسماؤه في الكود
كل سطر هو كلمة مكتبة واحدة عن نفس الشيء. خد السطر اللي بيكلّم مشروعك.
شوف كمان
آخر تحديث · 2026-08-19