EduFlow

الوحدة 2 · الـ Design Tokens

تسمية الـ Tokens لتعيش طويلًا

18 دقراءة 4 داختر بحكمة

الدرس في لمحة

سمِّ الـ design tokens وفق قواعد مكتوبة من فئة ومفهوم وخاصية وvariant وحالة، حتى تبقى الأسماء صادقة مع الوضع الداكن والعلامات الجديدة وسنوات من النمو.

  1. 1قواعد، لا قائمة
  2. 2سمِّ الغرض، لا المظهر
  3. 3السلالم: أرقام أم مقاسات
  4. 4افرض القواعد
  5. 5إعادة التسمية دون كسر عمل الآخرين

لا فيديو هنا، بل الشيء الحقيقي: درس مكتوب وأمثلة قابلة للتشغيل واختبار وتدريب.

كان في ملف الـ tokens القديم في Northwind token اسمه --color-blue-new. بعد سنتين صار هناك أيضًا --color-blue-new-2 و--color-blue-newer. ولم يعرف أحد أيّها أزرق العلامة. التسمية هي الجزء من نظام التصميم الذي يبدو جدالًا على التوافه، ثم يتبيّن أنه معمارية: فالأسماء هي الـ API الذي يكتبه كل مصمّم ومهندس مئات المرات في الأسبوع.

قواعد، لا قائمة

الأسماء الجيدة للـ tokens تأتي من قواعد: مجموعة ثابتة من الأجزاء بترتيب ثابت. والـ semantic tokens في Northwind تتبع هذه القواعد:

Text
--nw-{category}-{concept}-{property}-{variant}-{state}

--nw-color-action-bg                 category=color concept=action property=bg
--nw-color-action-bg-hover           … state=hover
--nw-color-danger-text               concept=danger property=text
--nw-color-text-subtle               concept=text variant=subtle
--nw-space-inset-md                  category=space concept=inset variant=md
--nw-radius-control                  category=radius concept=control

ليس كل token يستخدم كل الأجزاء، لكن الأجزاء الموجودة تأتي دائمًا بهذا الترتيب. وهذا يمنحك أمرين. يستطيع الناس تخمين أسماء لم يروها قط: إن كان --nw-color-action-bg-hover موجودًا، فالأرجح أن --nw-color-danger-bg-hover موجود أيضًا. وحين تُرتَّب أبجديًا، تتجمّع الـ tokens المترابطة معًا في كل محرّر وفي لوحة المتغيّرات في Figma.

البادئة nw نطاق أسماء (namespace). تمنع التصادم مع CSS من أطراف خارجية، وتجعل tokens النظام سهلة البحث، وهذا ما ستستخدمه لاحقًا في مقاييس التبنّي.

سمِّ الغرض، لا المظهر

في طبقة الـ primitives تكون تسمية المظهر صحيحة: --nw-blue-600 هو أزرق فعلًا. أما في الطبقة الدلالية فالمظهر هو بالضبط ما تغيّره الـ themes، لذا يجب أن تصف الأسماء الغرض.

اسم هشّ لماذا ينكسر اسم متين
--nw-color-red-bg لون الخطأ في Tidewater برتقالي --nw-color-danger-bg
--nw-color-text-light في الوضع الداكن ليس فاتحًا --nw-color-text-subtle
--nw-color-header-bg مسمّى باسم أول مستخدم له --nw-color-surface-inverse
--nw-color-text-2 لا يقول شيئًا --nw-color-text-muted

السلالم: أرقام أم مقاسات

سلالم الـ primitives تحتاج أيضًا إلى نظام تسمية. وهناك خياران شائعان:

  • رقمي، مثل 100 إلى 900 لدرجة سطوع اللون، أو 1 إلى 12 لخطوات المسافات. يمكنك إدراج 150 لاحقًا دون إعادة تسمية أي شيء. والأرقام وحدها لا تحمل معنى كبيرًا.
  • مقاسات الملابس، مثل xs وsm وmd وlg وxl. سهلة القراءة في مراجعة الكود. لكن حين يحتاج المصمّمون إلى خطوة بين sm وmd تعلق بأسماء مثل sm-plus.

تستخدم Northwind السلالم الرقمية للـ primitives، ومقاسات الملابس لحفنة tokens المسافات الدلالية (--nw-space-inset-sm و-md و-lg)، لأن المصمّمين يفكّرون بالمقاسات وهذه المجموعة نادرًا ما تكبر. اختر نظامًا واحدًا لكل سُلّم والتزم به. أما الخلط بينهما داخل سُلّم واحد، مثل --nw-space-2 و--nw-space-md و--nw-space-24px، فهو أسرع طريق إلى سُلّم لا يثق به أحد، لأن الناس لم يعودوا يميّزون أيّ القيم أشقاء.

افرض القواعد

القواعد التي تعيش فقط في صفحة wiki تصمد حتى أول مساهم مستعجل. حوّلها إلى فحص يعمل في الـ CI:

JavaScript
const grammar = /^--nw-(color|space|radius|font|shadow|motion)(-[a-z]+)+(-[0-9]+)?$/;
const banned = /-(red|blue|green|light|dark|new|old|[0-9]+px)(-|$)/;

const proposed = [
  '--nw-color-action-bg-hover',
  '--nw-color-text-light',
  '--nw-color-blue-new',
  '--nw-space-inset-md',
  '--nwColorDangerText',
  '--nw-color-danger-text',
];

for (const name of proposed) {
  const ok = grammar.test(name) && !banned.test(name);
  console.log(ok ? 'ok    ' : 'reject', name);
}

قائمة banned تلتقط العادات التي تنكسر أولًا: أسماء الألوان، و«light» و«dark»، و«new» و«old»، وقيم البكسل الخام. شغّلها على كل ملف tokens في الـ pull requests، واطبع القاعدة التي فشلت حتى يتعلّم المساهمون القواعد من رسالة الخطأ لا من صفحة wiki. إنها أداة فظّة، وسترفض أحيانًا اسمًا جيدًا. لا بأس بذلك؛ فالمساهم الذي يصطدم بها يسأل فريق النواة، والحوار نفسه هو المقصود.

إعادة التسمية دون كسر عمل الآخرين

ستخطئ في بعض الأسماء؛ الجميع يخطئ. حين تعيد تسمية token، أبقِ الاسم القديم اسمًا مستعارًا (alias) للجديد لإصدار واحد على الأقل، وعلّمه كـ deprecated (مُهمَل)، وأعلن ذلك في الـ changelog. يغطّي القسم 4 مسار الـ deprecation كاملًا. في التمرين التالي تراجع دفعة من الأسماء المقترحة كما يفعل فريق النواة في Northwind كل أسبوع. وبعدها تشغّل الطبقة الدلالية: مجموعة مكوّنات واحدة، وعدّة themes.

أهم النقاط

  • أسماء الـ semantic tokens تصف الغرض (danger، subtle) ولا تصف المظهر (red، light) أبدًا، لأن المظهر يتغيّر مع الـ themes.
  • الترتيب الثابت لأجزاء الاسم، مثل category-concept-property-variant-state، يجعل الـ tokens سهلة التخمين وسهلة الترتيب.
  • السلالم الرقمية مثل 100 إلى 900 تترك مجالًا لإدراج قيم لاحقًا؛ أما مقاسات الملابس فأسهل قراءة لكنها تمتلئ.
  • اكتب قواعد التسمية وافرضها بقاعدة lint، وإلا اخترع كل مساهم قواعده الخاصة.

قراءات إضافية

تحقّق من فهمك

4 أسئلة

السؤال 1 من 4

أيّ اسم semantic token سيبقى دقيقًا بعد أن تضيف Northwind الوضع الداكن؟

السؤال 2 من 4

أنشأ فريق الـ dispatch الـ token المسمّى --nw-color-header-bg للشريط العلوي. والآن يحتاج الشريط الجانبي إلى اللون نفسه. ما أفضل خطوة؟

السؤال 3 من 4

سُلّم المسافات لديك هو --nw-space-sm و-md و-lg. يحتاج المصمّمون الآن إلى قيمة بين sm وmd. ماذا يكشف هذا؟

السؤال 4 من 4

لماذا تمنع صيغة DTCG وجود . داخل أسماء الـ tokens؟

تدريب

اختر بحكمة

راجع اقتراحات الـ tokens لهذا الأسبوع

اقتُرحت ستة أسماء semantic tokens على Northwind UI هذا الأسبوع. يجب أن يدعم النظام الـ theme الفاتح والداكن وعلامتين (Northwind وTidewater)، ويتبع القواعد --nw-{category}-{concept}-{property}-{variant}-{state}. اختر كل اسم توافق عليه كما هو مكتوب.

راجع اقتراحات الـ tokens لهذا الأسبوع