Mercato

الرموز

الحدود

نظام حدود من ثلاث طبقات يحكم عرض الخط فقط. سلّم من خمس درجات، ورموز أولية، وثمانية رموز دلالية في مجموعتين: بنيوية وحالة. اللون يأتي من طبقة الألوان.

العرض هنا، اللون هناك

رموز الحدود تحدّد العرض فقط، تُقرن دائماً بنمط ولون من طبقة الألوان: border: var(--border-base) solid var(--color-border-base-medium). حلقة التركيز تستخدم outline لا border كي لا تزيح التخطيط. انقر أي حدّ لنسخ رمزه.

المعمار

ثلاث طبقات بلا أوضاع. السلّم خمس درجات (0، 0.5، 1، 2، 4). الأولية تسمّيها (none إلى lg). الدلالية ثمانية أدوار في ستة مستويات تسلسل. المكوّنات تستخدم الأدوار الدلالية فقط.

السلّم والأولية

السلّم
الأولية

الحدود البنيوية

ستة أدوار بنيوية في مستويات تسلسل ١–٥. divider وcontainer كلاهما ١ بكسل لكن غير متبادلين: الأول للتجاور، والثاني للتأطير.

استخدم · أخفّ حافة دون لفت انتباه: فواصل القوائم الكثيفة، الفصل الخلفي.

تجنّب · الاحتواء، الحالات التفاعلية، أو أي حدّ يحتاج قراءة واضحة؛ ليس الفاصل الوحيد على شاشات 1x.

استخدم · الحدّ الافتراضي: الحقول والبطاقات والمكوّنات القياسية.

تجنّب · حدود الأقسام، الحالات المختارة، الفصل عالي التأكيد.

استخدم · بين الأشقاء المتجاورين تحت أب واحد: عناصر القوائم، صفوف الجداول.

تجنّب · الإطارات الخارجية، حدود الاحتواء، المناطق الكبرى.

استخدم · لتأطير مجموعة محدودة: البطاقات، مجموعات الإعدادات، اللوحات.

تجنّب · التجاور البسيط، فواصل الصفوف، تقسيم الصفحة.

استخدم · حين يجب أن يقف الحدّ فوق البنية الافتراضية دون معنى تفاعلي.

تجنّب · البنية الافتراضية، الاحتواء المتكرّر، الحالة التفاعلية.

استخدم · مناطق التخطيط الكبرى وحدود الأقسام الأساسية.

تجنّب · الحاويات الافتراضية، حدود المكوّنات، المجموعات المحلية.

حدود الحالة

رمزان محجوزان للحالات التفاعلية فقط. حلقة التركيز تُرسم عبر outline بإزاحة، بلون --color-focus-default. جرّب التركيز على الزر أدناه بلوحة المفاتيح.

استخدم · حدود العناصر المختارة/المفعّلة التفاعلية.

تجنّب · البنية المحايدة، التجميع الخامل، التأطير غير الاختياري.

استخدم · حلقات تركيز لوحة المفاتيح على كل العناصر التفاعلية (عبر outline).

تجنّب · الحدود الزخرفية، تنسيق الاختيار الدائم، مؤشّرات التحويم.

مختار

التركيز = outline؛ الاختيار = border.

متى تستخدم حدّاً

الحدّ أداة الملاذ الأخير: استنفد المساحة وتباين السطح أولاً. هذه المصفوفة تختصر القرار.

الموقفالأداة
حالة مختارة أو تركيزحدّ — border.selected / border.focus
منطقة تخطيط كبرىخلفية + مساحة (border.section عند الحاجة)
حدّ مكوّن قياسيحدّ — border.base
فصل بين أشقاءأولاً مساحة؛ ثم border.divider

المبادئ

عشرة مبادئ حاكمة لقرارات الحدود.

01الوظيفة

كل حدّ يؤدي وظيفة بنيوية محدّدة قبل اختيار وزنه.

02الوزن

الحدود الأثقل تنقل أهمية بنيوية أعلى.

03الأدوات

الحدّ أحد ثلاث أدوات بنيوية (خط/مسافة/سطح)؛ الاختيار الخاطئ يضعف الوضوح.

04الكثافة

شدّة استخدام الحدود تتناسب مع كثافة الواجهة.

05الاحتواء

حدود الحاوية والفاصل تخدمان غرضين بنيويين مختلفين.

06الحالة

حدود حالة التفاعل تبقى مميّزة بصرياً عن الحدود البنيوية.

07الشعري

الحدود دون البكسل تتطلّب استخداماً متعمّداً ومضبوطاً.

08الاعتدال

تُضاف الحدود فقط حين تعجز المساحة والخلفية عن تحقيق الفصل.

09الثبات

دور رمز الحدّ الدلالي لا يتغيّر عبر السياقات.

10إمكانية الوصول

حدود التركيز والاختيار تحقّق التباين بمعزل عن اللون.

إمكانية الوصول

المعيارالمستوىلماذا ينطبق
2.4.7 · التركيز مرئيAAborder.focus يجب أن يُحلّ ≥ ١ بكسل؛ 0.5 غير موثوق، و0 يُخفي حلقة التركيز.
1.4.1 · استخدام اللونAAborder.selected مؤشّر اختيار غير لوني؛ لو صار 0 يعتمد الاختيار على اللون وحده.
1.4.11 · تباين غير النصAAحدود التركيز/الاختيار تحقّق 3:1 مع المجاور؛ هذه الطبقة تفحص كفاية العرض، واللون في طبقة الألوان.
BLOCKER

border.focus لا يُعاد إلى 0 أبداً.

BLOCKER

border.selected لا يصير 0 إلا مع مؤشّر غير لوني آخر.

WARNING

border.subtle (0.5) ليس الفاصل الوحيد على شاشات 1x.

WARNING

تسلسل الأوزان محفوظ: مجموعة ٢ فوق مجموعة ١.

الشيفرة للمطوّرين

التسليم الأساسي لطبقة الحدود هو متغيّرات CSS المخصّصة، وهي موحّدة عبر الأوضاع (عرض فقط، لا لون ولا نمط). المكوّنات تستهلك الأدوار الدلالية فقط، وتقرنها دائماً بنمط ولون حدّ من طبقة الألوان.

سلسلة المتغيّرات

المتغيّرات تُبنى على ثلاث طبقات: مدرّج أوّلي، ثم رمز أوّلي، ثم رمز دلالي يُحلّ حسب الوضع. المكوّنات تستهلك الطبقة الدلالية فقط.

عقد CSS
/* Tier 1 — scale (raw widths) */
--border-scale-100: 1px;
--border-scale-200: 2px;

/* Tier 2 — primitive size aliases */
--border-sm: var(--border-scale-100);
--border-md: var(--border-scale-200);

/* Tier 3 — semantic role; components consume THIS */
:root {
  --border-base: var(--border-sm);    /* 1px — default structure */
  --border-strong: var(--border-md);  /* 2px — structural emphasis */
  --border-focus: var(--border-md);   /* 2px — keyboard focus ring */
}

/* A component pairs the width token with a style + Color-layer color */
.card {
  border: var(--border-base) solid var(--color-border-base-medium);
}

جدول المرجع

الرمزمتغيّر CSSالقيمةالاستخدام
border.subtle--border-subtle0.5pxأخفّ فصل، المستوى ١
border.base--border-base1pxالبنية الافتراضية، المستوى ٢
border.divider--border-divider1pxفصل المحتوى المتجاور، المستوى ٣
border.container--border-container1pxتأطير مجموعة محدودة، المستوى ٣
border.strong--border-strong2pxتأكيد بنيوي، المستوى ٤
border.selected--border-selected2pxحدّ الاختيار أو النشاط
border.focus--border-focus2pxعرض حلقة تركيز لوحة المفاتيح

الاستخدام

مثال
.card {
  border: var(--border-base) solid var(--color-border-base-medium);
  border-radius: var(--shape-surface-base);
}
.card--selected {
  border: var(--border-selected) solid var(--color-focus-default);
}
/* Focus uses outline, not border, so it never shifts layout */
.button:focus-visible {
  outline: var(--border-focus) solid var(--color-focus-default);
  outline-offset: 2px;
}

أخطاء شائعة

الخطأما يفسدالصواب
border: 1px solid ...العرض غير مربوط برمز؛ لا يتّسق مع الكثافةvar(--border-base)
استخدام border لحلقة التركيزيزيح التخطيط عند التركيزoutline: var(--border-focus) solid var(--color-focus-default)
ضبط العرض بلا لون حدّيورّث لون النص للحدّاقرن دائماً بـ --color-border-*
تبديل divider وcontainerانحراف دلالي بين التجاور والتأطيراختر الدور حسب الوظيفة

كيف تُستهلك

الرموز مصدرها واحد آلي القراءة (tokens.json في المهارة). حزمة @mercato/tokens تولّد منه: متغيّرات CSS (التسليم الأساسي)، وإعداد Tailwind جاهز، وكائن سمة مطبوع بـ TypeScript. أهداف المنصّات الأخرى (Style Dictionary وDTCG وiOS وAndroid وCompose) تتولّد من المصدر نفسه عند الطلب.

الاستيراد
// CSS variables (canonical) — import once at the app root
import "@mercato/tokens/css";

// Tailwind preset
// tailwind.config: { presets: [require("@mercato/tokens/tailwind")] }

// Typed theme object (JS/TS)
import { tokens } from "@mercato/tokens";