Mercato

الرموز

الارتفاع

نظام ارتفاع من أربع طبقات: سلّم عمق، وأوّليات ظل، وأربعة أنماط ظل، وستة مستويات سطح تقرن كلاً منها بعمق ولون خلفية وظل. الظل يتكيّف مع السمة فيُقرأ العمق بالتساوي في الفاتح والداكن.

الظل عمق لا حدّ

كل سطح يقرن عمقاً (z-index) + لون خلفية من طبقة الألوان + ظلّاً. z-index فقط عبر رموز depth. الحاجب لا يحمل ظلّاً ويجب أن يكون تحته سطح Elevated. انقر أي سطح لنسخ ظلّه، وبدّل السمة من الأعلى لترى الظل يتكيّف.

المعمار

أربع طبقات. سلّم العمق خمس مواضع (0–4) لترتيب التكديس. أوّليات الظل هندسة خام (محور y، تمويه، انتشار). أنماط الظل الأربعة مركّبة منها، وتتكيّف ألفاها مع السمة. المستويات الستة تقرن عمقاً بلون خلفية وظل.

سلّم العمق
أنماط الظل (ألفا فاتح/فاتح)

المستويات

ستة مستويات سطح، كل منها دور دلالي حيّ: خلفية حقيقية + ظل حقيقي على عمقه. انقر أي سطح لنسخ ظلّه.

color.plane.canvasdepth.0 · no shadow

الجذر البيئي خلف كل المحتوى.

استخدم · خلفية الصفحة/التطبيق الافتراضية، هادئة ومستقرّة.

تجنّب · التأكيد، الارتفاع، أو احتواء محتوى محدّد.

color.plane.sectiondepth.0 · no shadow

تجميع أساسي بتنويع لوني هادئ بلا ارتفاع.

استخدم · تجميع مناطق مترابطة عبر لون الخلفية فقط.

تجنّب · الظل أو استخدامه بديلاً عن تأكيد Raised.

color.plane.surfacedepth.1

سطح العمل المحتوى الافتراضي.

استخدم · البطاقات، اللوحات، الحقول.

تجنّب · المقاطعة أو التكديس بلا سبب تسلسلي.

color.plane.raiseddepth.2

احتواء أقوى دون مقاطعة.

استخدم · تقوية الفصل مع البقاء غير مقاطِع.

تجنّب · اختصار للنافذة/الأولوية العليا أو الإفراط بين الأشقاء.

color.plane.overlaydepth.3 · no shadow

طبقة حجب خلف سطح أمامي نشط.

استخدم · طبقة حجب فقط، مقترنة دائماً بـ Elevated فوقها.

تجنّب · خلفية محتوى أو ظلّ على كائن.

color.plane.elevateddepth.4

أعلى طبقة أمامية للتفاعلات الحرجة.

استخدم · النوافذ، الحوارات، لوحات الأوامر، القوائم المنبثقة.

تجنّب · التخطيط الروتيني أو حين يكفي الاحتواء.

اقتران الحجب والعائم

القاعدة الحاسمة: plane.overlay يجب أن يكون فوقه plane.elevated دائماً. Elevated بلا Overlay صالح؛ Overlay بلا Elevated غير صالح. حالة الرفع المؤقت (سحب/فتح) تعود لعمقها في الراحة.

المبادئ

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

01سلامة الدور

كل سطح يشغل دوراً دلالياً محدّداً في مكدّس الارتفاع.

02تباين التسلسل

فروق الارتفاع بين الطبقات المتجاورة يجب أن تكون مدرَكة بصرياً.

03الاعتدال

كل سطح يستخدم أدنى دور صالح يحقّق الفصل المطلوب.

04الظل تواصل

الظلال تنقل العمق، ليست زخرفة.

05احتواء مقابل انفصال

الأسطح المحتواة والعائمة تخدمان أغراضاً مختلفة جوهرياً.

06قصد الحجب

الحاجب موجود فقط كطبقة حجب خلف سطح أمامي نشط.

07الفصل الزمني

تغيّرات الارتفاع الناتجة عن التفاعل مؤقتة وتنهار عند انتهائه.

08صحّة الاقتران

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

09التخطيط أولاً

تُحلّ مشاكل التخطيط البنيوية بأدوات التخطيط قبل تطبيق الارتفاع.

10اتساق الأوضاع

رموز الارتفاع تنتج إدراكاً متكافئاً للعمق عبر كل السمات.

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

المعيارالمستوىلماذا ينطبق
1.4.11 · تباين غير النصAAلو نُقل حدّ السطح بالظل وحده (بلا فرق لون أو حدّ) وجب أن يحقّق الظل 3:1 مع الخلفية، وكل الظلال تفشل بذلك.

الظل ليس صانع حدود

المعالجة معمارية: كل سطح يحمل لون خلفية مميّزاً (color.bg.base.*) أو حدّاً؛ الظل إشارة عمق لا صانع حدود. الحاجب لا يحمل ظلّاً أبداً، وألفا الظل في الوضع الداكن مضبوطة باستقلال.

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

التسليم الأساسي لطبقة الارتفاع هو متغيّرات CSS المخصّصة. المكوّنات تقرأ المستويات فقط (bg + shadow + depth)، ولا تلمس أوّليات الظل ولا قيم box-shadow خام أبداً. الظل مضمّن السمة: ألفاه ترتفع تلقائياً في الوضع الداكن فيُقرأ العمق بالتساوي.

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

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

عقد CSS
/* Tier 1 — depth scale (z-index only) */
--depth-1: 1;
--depth-4: 4;

/* Tier 2 — shadow primitives (raw geometry) */
--shadow-y-axis-8: 8px;
--shadow-blur-16: 16px;
--shadow-spread-n4: -4px;

/* Tier 3 — composed shadow styles, theme-aware alpha */
:root {
  --elevation-shadow-1: 0px 1px 2px 0px rgba(0, 0, 0, 0.05), 0px 1px 1px 0px rgba(0, 0, 0, 0.03);
  --elevation-shadow-3: 0px 8px 16px -4px rgba(0, 0, 0, 0.1), 0px 2px 4px -1px rgba(0, 0, 0, 0.08);
}
:root[data-theme="dark"] {
  --elevation-shadow-1: 0px 1px 2px 0px rgba(0, 0, 0, 0.4), 0px 1px 1px 0px rgba(0, 0, 0, 0.3);
  --elevation-shadow-3: 0px 8px 16px -4px rgba(0, 0, 0, 0.5), 0px 2px 4px -1px rgba(0, 0, 0, 0.4);
}

/* Tier 4 — plane semantics; components consume THESE */
--plane-surface-shadow: var(--elevation-shadow-1);
--plane-elevated-shadow: var(--elevation-shadow-3), var(--elevation-shadow-4);

جدول المرجع

الرمزمتغيّر CSSالقيمةالاستخدام
elevation.shadow.1--elevation-shadow-1alpha .05/.03 → .4/.3أخفض ظل، يتكيّف مع السمة
elevation.shadow.3--elevation-shadow-3alpha .1/.08 → .5/.4ظل مرتفع للأسطح العائمة
plane.surface.shadow--plane-surface-shadowelevation-shadow-1ظل البطاقة على العمق ١
plane.raised.shadow--plane-raised-shadowelevation-shadow-2قائمة منسدلة، عمق ٢
plane.elevated.shadow--plane-elevated-shadowshadow-3, shadow-4نافذة عائمة، عمق ٤
plane.overlay.shadow--plane-overlay-shadownoneحاجب: حجاب لا ظل
depth.4--depth-44z-index للأسطح العائمة

الاستخدام

مثال
.card {
  background: var(--plane-surface-bg);
  box-shadow: var(--plane-surface-shadow);
}
.modal {
  z-index: var(--depth-4);
  background: var(--plane-elevated-bg);
  box-shadow: var(--plane-elevated-shadow);
}
/* No dark-mode override needed: the shadow tokens raise their
   alpha automatically under :root[data-theme="dark"]. */

أخطاء شائعة

الخطأما يفسدالصواب
box-shadow: 0 8px 16px rgba(0,0,0,.1)لا ترتفع الألفا في الداكن، فيختفي العمقvar(--plane-elevated-shadow)
الظل كفاصل الأسطح الوحيدالظل إيماءة عمق لا حدّاقرنه بخلفية المستوى أو حدّ
ظل box-shadow على الحاجبيمنح الحجاب حافة زائفةvar(--plane-overlay-shadow)
رقم z-index خاميكسر سلّم التكديسvar(--depth-4)

كيف تُستهلك

الرموز مصدرها واحد آلي القراءة (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";