مخطط الألوان دون مساعدة المصمم


بالتأكيد كان الكثير منكم في وضع تحتاج فيه إلى اختيار ألوان الديكور بسرعة ، والمصمم مشغول بمهام أكثر أهمية ، في مزاج سيئ أو في إجازة. المهمة ليست صعبة ، ولكن في بعض الأحيان عليك الانتظار للحصول على إجابة لعدة أيام.

اسمي إميل فرولوف ، وأنا من خبراء التكنولوجيا في فريق الخدمات الداخلية في DomKlik. في هذه المقالة سأخبرك كيف ولدت فكرة المكتبة ، والتي توفر الآن الكثير من الوقت عند اختيار الألوان. الحل بسيط ولكنه مفيد جدًا ، ضعه في الخدمة.

خاصة إذا كنت بحاجة إلى اختيار الألوان للمخطط الداكن.

مهمة


يحتوي DomKlik على بوابة مؤسسية ، لكل قسم نظام ألوان خاص به. في السابق ، لإنشاء قسم جديد ، كان علي في كل مرة أن أعذب المصممين وأطلب منهم اختيار مجموعة جديدة من الألوان ونقلها إلى الواجهة. اتضح كمية كبيرة من التعليمات البرمجية الإضافية ، وقضى الكثير من الوقت في المراسلات والانتظار والتنسيق. أردت حقًا تبسيط العملية بأكملها وتسريعها.

بحثنا عن حلول جاهزة على الإنترنت ، ولكن لم يتم العثور على أي شيء مناسب. ثم قرروا كتابة مكتبة: أدخل اللون (العلامة التجارية) التي يعطيها المصمم ، والمكتبة تختار بعض الألوان الأكثر ملاءمة. أردنا أيضًا أن تولد المكتبة مخططات ألوان داكنة أيضًا.
هذه ليست وصفة للسعادة ، بل فكرة يمكن للجميع تطويرها في إطار مشروعهم. يمكنك مشاهدة عرض صغير هنا .

الفكرة والحل


فكرنا كيف نفعل ذلك. بدأنا باستخدام خوارزمية توليد الألوان الأساسية. مرة أخرى على الإنترنت الخاص بك لم يتم العثور على أي شيء جاهز. لكنهم وجدوا مكتبة يمكنها تغيير إعدادات الألوان المختلفة.

يعرف الكثير من الناس أن هناك العديد من خوارزميات مطابقة الألوان المختلفة:



لا أرى أي معنى في رسمها ؛ لقد فعلوا ذلك بالفعل مئات المرات أمامي. ولكن هناك بعض النقاط الرئيسية:

  1. بالنسبة لنا فهي زائدة عن الحاجة.
  2. كنت أرغب في اختيار الألوان لنفسي.

لذلك ، قرر المصمم والمطور ، الذي تم دمجه في دفعة واحدة ، التقاط المخطط يدويًا مرة واحدة.

بادئ ذي بدء ، وصفنا الألوان الأساسية:

export const getColors = (projectColor, inverse) => {
  ...
  const BASE_SUCCESS = '#00985f';
  const BASE_WARNING = '#ff9900';
  const BASE_PROGRESS = '#fe5c05';
  const BASE_ALERT = '#ff3333';
  const BASE_SYSTEM = '#778a9b';
  const BASE_NORMAL = '#dde3e5';
  const BASE_WHITE = '#ffffff';
  const BASE_BLACK = '#000';
  const TYPO_BASE_BLACK = '#242629';
  const TYPO_LINK = '#33BDFF';
  ...
}

بناءً على ذلك ، يمكنك البدء في الإنشاء. نحصل على كائنات للعمل مع الألوان الأساسية.

  import color from 'color-js';

  export const getColors = (projectColor, inverse) => {
    ...
    const baseWhite = color(BASE_WHITE);
    const baseBlack = color(BASE_BLACK);
    const baseTypoBlack = color(TYPO_BASE_BLACK);
    ...
  }

أعتقد أنه ليس من المنطقي وصف مجموعة الألوان بالكامل ، ولكن على سبيل المثال سأقدم بضعة أسطر:

export const getColors = (projectColor, inverse) => {
  ...
  const bgBrand = baseProject;
  const bgHard = baseColor.setLightness(0.4);
  const bgSharp = baseColor.setLightness(0.18);
  const bgStripe = baseColor.setLightness(0.1);
  const bgGhost = baseColor.setLightness(0.07);
  ...
}

بعد الانتهاء من اختيار الألوان الأساسية ، واجهنا المشكلة التالية.

وما لون عرض النص على العناصر؟

لم تكن المهمة صعبة كما بدت. لحلها من القيمة السداسية ، نحتاج إلى الحصول على سطوع العنصر. قمنا بذلك بوظيفتين مساعدتين. الأول يترجم السداسي إلى RGB:

const hexToRgb = (hex) => {
  const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
  const newHex = hex.replace(shorthandRegex, (
    magenta,
    red,
    green,
    blue
  ) => red + red + green + green + blue + blue);

  const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(newHex);

  return result ? {
    red: parseInt(result[1], 16),
    green: parseInt(result[2], 16),
    blue: parseInt(result[3], 16)
  } : null;
};

الوظيفة الثانية من RGB تحصل على سطوع الخلفية وتقرر ما إذا كان اللون داكنًا أو فاتحًا:

export const getBgTextColor = (bgColor) => {
  const rgb = hexToRgb(bgColor);
  const light = (rgb.red * 0.8 + rgb.green + rgb.blue * 0.2) / 510 * 100;

  return light > 70 ? '#000000' : '#ffffff';
};

قد تعتقد أن كل شيء جاهز الآن للخطوة التالية. ولكن لا ، ما زلنا نريد دعمًا لمظهر مظلم خارج الصندوق؟ نعم! نريدها!

ربما لاحظت أننا ننقل العلم إلى وظيفتنا inverse. دعنا نغير الشفرة قليلاً مع وضع هذه العلامة في الاعتبار:

import color from 'color-js';

export const getColors = (projectColor, inverse) => {
  ...
  const BASE_SUCCESS = '#00985f';
  const BASE_WARNING = '#ff9900';
  const BASE_PROGRESS = '#fe5c05';
  const BASE_ALERT = '#ff3333';
  const BASE_SYSTEM = '#778a9b';
  const BASE_NORMAL = '#dde3e5';
  const BASE_WHITE = '#ffffff';
  const BASE_BLACK = '#000';
  const TYPO_BASE_BLACK = '#242629';
  const TYPO_LINK = '#33BDFF';

  ...

  const baseWhite = color(BASE_WHITE);
  const baseBlack = color(BASE_BLACK);
  const baseTypoBlack = color(TYPO_BASE_BLACK);
  const baseColor = inverse ? baseWhite : baseBlack;
  const typoColor = inverse ? baseWhite : baseTypoBlack;

  ...

  const bgHard = inverse ? baseColor.setLightness(0.4) : baseColor.lightenByAmount(0.85);
  const bgSharp = inverse ? baseColor.setLightness(0.18) : baseColor.lightenByAmount(0.95);
  const bgStripe = inverse ? baseColor.setLightness(0.1) : baseColor.lightenByAmount(0.96);
  const bgGhost = inverse ? baseColor.setLightness(0.07) : baseColor.lightenByAmount(0.99);

  ...
}

هذا كل شئ. يمكننا إعطاء قائمة بالألوان:

return {
  ...
    // BG
    'color-bg-hard': bgHard.toString(),
    'color-bg-sharp': bgSharp.toString(),
    'color-bg-stripe': bgStripe.toString(),
    'color-bg-ghost': bgGhost.toString(),
    'color-bg-primary': bgDefault.toString(),
  ...
}

في يومين ، وبمساعدة مصممنا ، قمت بإنشاء مكتبة ، والتي تعطي عند المخرج لوحة ألوان لمظهر داكن وخفيف.

السؤال التالي: كيف تستخدمه؟

بسيط جدا. لتنفيذ نظام الألوان الذي تم إنشاؤه ، استخدمنا إدراج متغيرات CSS من خلال كتلة النمط. يتجنب هذا التعارض مع متغيرات CSS التي تستخدمها مكتبات CSS الأخرى.

  const colors = getColors(color, themeKey === 'dark');
  const colorsVars = Object.keys(colors).map((key) => `--${key}: ${customColors[key]}`).join(';');
  
  const link = document.createElement('style');
  const headTag = document.getElementsByTagName('head')[0];

  link.type = 'text/css';
  link.id = 'project-theme-scope';
  const stylesBody = `:root {${colorsVars}}`;

  link.innerText = stylesBody;

  headTag.append(link);

والآن اللذيذ. انتباه انتباه! الآن ، مع بضعة أسطر ، عندما نضيف دعمًا مظلمًا مظلمًا لنصف العناصر:

  body {
    background: var(--color-bg-ghost);
    color: var(--color-typo-primary);
  }

والنتيجة هي مكتبة نمر فيها اللون الرئيسي للعلامة التجارية ونحصل على مجموعة من متغيرات CSS ، والتي نستخدمها بعد ذلك لتلوين مشروعنا.

تم إنفاق معظم الوقت على اختيار نظام الألوان. اضطررت إلى فرز مجموعة من المعلمات المختلفة يدويًا حتى يتم دمج الألوان مع بعضها البعض. ولكن الآن ، في كل تكرار لاختيار الألوان للأقسام الجديدة في البوابة ، نوفر عدة أيام.

منذ أن شارك المصمم في إنشاء الخوارزمية ، لم يكن هناك أي حالة أنه غير راضٍ عن الألوان التي ولّدتها المكتبة. نعم ، ومخططات الألوان ليست كبيرة جدًا ، فمن الصعب ارتكاب الأخطاء.

أؤكد مرة أخرى أننا لا ندعي أننا القرار الصحيح الوحيد. يتم تنفيذ هذه الفكرة ، وهي تعمل بشكل جيد. حاولت أن أجلب لك النقاط الرئيسية ، وتعتمد تفاصيل ونطاق التنفيذ فقط عليك وعلى مشروعك.

شكرا للانتباه.

All Articles