الشارة
Badgerole="status" / badgeContent
اسمه كمانبادج، عدّاد الإشعارات، النقطة الحمراء، شارة العدّ، شارة الحالة، عدّاد غير المقروء، notification badge، count badge، dot badge، status badge، unread count، notification dot
الشارة علامة صغيرة تلتصق بركن عنصر آخر وتقول عنه شيئاً واحداً: كم عدد الأشياء التي تنتظر بداخله، أو أنّ فيه جديداً لم يُرَ بعد. وهي تابعة دائماً ولا تُقرأ وحدها، فالشارة فوق أيقونة البريد تصف البريد لا نفسها. وهي ليست شريحة (chip)، لأنّ الشريحة عنصر تحكّم يدخل في ترتيب الوصول بلوحة المفاتيح ويُضغط فيغيّر حالة الصفحة، أمّا الشارة فلا يصلها تركيز ولا ضغط، والمضغوط هو العنصر الذي تجلس عليه. وليست وسماً (tag)، لأنّ الوسم يجلس في تدفّق النصّ ويصنّف مقالاً أو منتجاً ويبقى مكانه وإن لم يتغيّر شيء، بينما الشارة مرساة على حافّة عنصر بعينه ولا وجود لها بدونه. وليست مؤشّر الحضور (presence dot) على صورة الحساب، لأنّ مؤشّر الحضور يصف حالة مستمرّة مثل «متصل»، أمّا نقطة الشارة فتصف شيئاً لم يُقرأ بعد وتزول بمجرّد قراءته. والاختبار الذي يفرزها عن الثلاثة هو الملكية: الشارة لا تملك إجراءً ولا مساحة لمس خاصّة بها، وكلامها يُكتب داخل الاسم المقروء للمرساة. ولها شكلان: شارة عدّ تحمل رقماً له سقف يُعرض عنده الرقم متبوعاً بعلامة زائد، وشارة نقطة بلا رقم لا تقول إلا إنّ هنا جديداً.
لو قلت عليه…
العيّنة الحيّة
تفاعل مع الديمو. كل الأجزاء حقيقية ومرقّمة.
تشريح العنصر: كل جزء واسمه
مرّر على أي سطر ليتحدّد مكانه في الديمو فوق.
برومبت البناء
سلوكه في الاتجاه من اليمين لليسار
الجزء ده حصري عندنا.
ركن الشارة
ينعكسالشارة تجلس عند النهاية المنطقية لأعلى المرساة، أي أعلى اليمين في الإنجليزية وأعلى اليسار في العربية. وإزاحتان منطقيّتان سالبتان تكفيان: inset-block-start: -6px مع inset-inline-end: -6px، فتنتقل الجهة وحدها بلا قاعدة خاصّة بـ RTL. أمّا الوصفة الشائعة inset-inline-end: 0 مع transform: translate(50%, -50%) فينعكس نصفها فقط، لأنّ transform لا نظير منطقيّ له، فتدفع translate(50%) الشارة نحو اليمين في الحالتين: خارج المرساة في الإنجليزية وفوق الأيقونة نفسها في العربية، والحلّ توقيع الإزاحة translate(calc(50% * var(--dir)), -50%) مع ضبط --dir: -1 داخل [dir="rtl"].
علامة الزائد في السقف
لا ينعكسفي نصّ مثل 99+ تحمل علامة الزائد صنف bidi المسمّى ES، والقاعدة W4 لا تضمّها إلى العدد إلا إذا وقعت بين رقمين أوروبيين، ولا رقم بعدها هنا. فتبقى محايدة وتأخذ اتجاه الفقرة، فتظهر داخل الصفحة العربية قبل الأرقام لا بعدها. اعزل الأرقام والعلامة معاً في عنصر واحد يحمل السمة dir="ltr"، فالسمة وحدها تجلب unicode-bidi: isolate من ورقة أنماط المتصفّح، بينما direction: ltr في CSS لا تعزل شيئاً وتحتاج unicode-bidi: isolate بجانبها.
نظام الأرقام
لا ينعكساختر نظام أرقام واحداً للمنتج كلّه، إمّا العربية الهندية من U+0660 إلى U+0669 وإمّا اللاتينية من U+0030 إلى U+0039، واضبطه في مكان واحد بـ new Intl.NumberFormat("ar", { numberingSystem: "latn" }) بدل ضبطه داخل كلّ مكوّن. والنظامان ليسا نسختين من شيء واحد حتى في bidi: اللاتينية صنفها EN والعربية الهندية صنفها AN، والقاعدة W4 تضمّ علامة الزائد أو الناقص بين رقمين من صنف EN وحده، فتبقى العلامة محايدة بين الأرقام العربية الهندية. وانتبه إلى الخطّ كذلك، فكثير من خطوط الواجهات لا تحوي محارف الأرقام العربية الهندية فيهبط المتصفّح إلى خطّ بديل داخل الشارة وحدها، و font-variant-numeric: tabular-nums لا تحوّل بين النظامين بل تختار بين أشكال الأرقام الموجودة في الخطّ أصلاً.
النقطة وإزاحتها
ينعكسالنقطة دائرة متماثلة، فلا شيء في شكلها ينعكس، ولا يصحّ أن تمرّ عليها قاعدة عامّة مثل [dir="rtl"] .icon { transform: scaleX(-1) }. لكنّ إزاحتها شيء آخر: مكتوبة بـ top: -2px مع right: -2px تبقى في الركن العلوي الأيمن الفيزيائي، وهو في العربية ركن البداية، فتقف النقطة في جهة وتقف بقيّة الشارات المكتوبة بخصائص منطقية في الجهة المقابلة داخل الشريط نفسه. اكتب الإزاحة inset-block-start و inset-inline-end، واترك حلقة box-shadow: 0 0 0 2px var(--surface) كما هي لأنّها متماثلة، وأعطِ أيّ clip-path جانبيّ نسخة معكوسة لأنّ clip-path بلا صيغة منطقية.
الشارة بعد تسمية نصّية
ينعكسحين تجلس الشارة بعد نصّ تبويب لا فوق أيقونة، فهي عنصر في تدفّق السطر لا عنصر مطلق الموضع، وجهتها تأتي من السطر: بعد الكلمة يعني يسارها في العربية. اكتب الفجوة بـ margin-inline-start على الشارة أو gap على الحاوية، ولا تكتبها margin-left لأنّها بعد الانعكاس تلصق الشارة بالكلمة من جهة وتضاعف المسافة من الجهة الأخرى. وأبقِ الشارة بعد التسمية في شجرة الـ DOM في اللغتين واترك direction تتولّى التبديل البصري، أمّا flex-direction: row-reverse فيعكس مرّة ثانية ويجعل ترتيب القراءة مخالفاً لترتيب الشجرة الذي يمشي عليه قارئ الشاشة.
أسماؤه في الكود
كل سطر هو كلمة مكتبة واحدة عن نفس الشيء. خد السطر اللي بيكلّم مشروعك.
شوف كمان
آخر تحديث · 2026-08-19