كيف تخلينا عن استخدام نظام التصميم لتصميم مكونات واختراع دراجتنا الخاصة

تحية للجميع! اسمي ساشا ، أنا شريك مؤسس ومطور رئيسي بدوام جزئي في Quarkly. في هذه المقالة ، أود أن أتحدث عن كيف شجعنا مفهوم CSS الذري ، الذي نلتزم به ، إلى جانب أوجه القصور في وظيفة نظام Styled-System (و Rebass ، كحالة خاصة لاستخدام هذه المكتبة) على إنشاء أداتنا الخاصة ، والتي أطلقنا عليها Atomize.

ديباجة صغيرة. مشروع Quarkly الخاص بنا هو مزيج من محرر رسومي (مثل Figma ، Sketch) ومصمم موقع (مثل Webflow) مع إضافة الوظائف المتأصلة في IDE الكلاسيكي. حول Quarkly ، سنكتب مشاركة منفصلة ، هناك شيء نقوله وما نعرضه ، ولكن اليوم سنتحدث عن Atomize المذكورة أعلاه.

Atomize هو أساس المشروع بأكمله ويسمح لنا بحل المشكلات التي سيكون من المستحيل أو الصعب حلها باستخدام Styled-System و Rebass. كحد أدنى ، سيكون الحل أقل أناقة.

إذا كان هناك القليل من الوقت للتغلب على المنشور بأكمله الآن ، فيمكنك التعرف على Atomize على GitHub .

ولجعل التعارف أكثر متعة ، فإننا نطلق مسابقة لتجميع مكونات التفاعل باستخدام Atomize. المزيد عن هذا في نهاية المنشور.

كيف بدأ كل شيء


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

المهمة ليست مبتكرة ، وللوهلة الأولى ، يتم حلها بالكامل بمساعدة Styled-System و Rebass. لكن هذه الوظيفة لم تكن كافية بالنسبة لنا ، بالإضافة إلى أننا واجهنا المشاكل التالية:

  • عمل غير مريح مع نقاط التوقف ؛
  • الافتقار إلى القدرة على كتابة الأنماط لتحوم الدولة ، والتركيز ، وما إلى ذلك ؛
  • بدا لنا أن آلية التعامل مع المواضيع ليست مرنة بما يكفي.

ما هو Atomize (لفترة وجيزة)


صورة

من الميزات الرئيسية لـ Atomize ، يمكننا تسليط الضوء على ما يلي:

  • القدرة على استخدام المتغيرات من الموضوع في خصائص css المركبة ؛
  • دعم التحويم وأي فئات زائفة أخرى ؛
  • الأسماء المستعارة القصيرة لكل عقار (كما في emmet) ؛
  • القدرة على تحديد الأنماط لنقطة توقف محددة ، مع الحفاظ على قراءة الترميز ؛
  • واجهة أضيق الحدود.

لدى Atomize غرضان رئيسيان:

  • إنشاء مكونات تدعم CSS الذرية والمواضيع ؛
  • إنشاء أدوات للتحرير التفاعلي في مشروع Quarkly.

تفتيت تعليمات الاستخدام


قبل بدء العمل ، من الضروري تحديد التبعيات:

npm i react react-dom styled-components @quarkly/atomize @quarkly/theme

Atomize عبارة عن غلاف حول المكون ذي النمط ولديه واجهة برمجة تطبيقات مماثلة. يكفي استدعاء الأسلوب باسم العنصر المطلوب:

import atomize from '@quarkly/atomize';
 
const MyBox = atomize.div();

عند الإخراج ، نحصل على مكون رد فعل يمكنه قبول أي CSS كدعائم.
لسهولة الاستخدام ، تم تطوير نظام الأسماء المستعارة للملكية. على سبيل المثال ، bgc === backgroundColor

ReactDOM.render(<MyBox bgc="red" />, root);

يمكن العثور على قائمة كاملة بالممتلكات والأسماء المستعارة هنا .

كما يتم توفير آلية الميراث رد الفعل:

const MySuperComponent = ({ className }) => {
   // some logic here
   return <div className={className} />;
};
 
const MyWrappedComponent = atomize(MySuperComponent);

العمل مع الموضوعات


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

لاستخدام المتغيرات من الموضوع ، يكفي وصف الخاصية في الموضوع والرجوع إلى هذه الخاصية باستخدام البادئة "-".

يمكن استخدام المتغيرات كما في JSX:

import Theme from "@quarkly/theme";
 
const theme = {
   colors: {
       dark: "#04080C",
   },
};
export const MyComp = () => (
   <Theme>
       <Box bgc="--colors-dark" height="100px" width="100px" />
   </Theme>
);

(يتوفر اللون # 04080C من خلال خاصية --colors-dark)

لذا في الموضوع نفسه:

import Theme from "@quarkly/theme";
 
const theme = {
   colors: {
       dark: "#04080C",
   },
   borders: {
       dark: "5px solid --colors-dark",
   },
};
export const MyComp = () => (
   <Theme>
       <Box border="--borders-dark" height="100px" width="100px" />
   </Theme>
);

(قمنا بإعادة استخدام المتغير من الألوان ، وربطه بموضوع الحدود)

بالنسبة للألوان في ترميز JSX ، يتم توفير بنية مبسطة:

import Theme from "@quarkly/theme";
 
const theme = {
   colors: {
       dark: "#04080C",
   },
};
export const MyComp = () => (
   <Theme>
       <Box bgc="--dark" height="100px" width="100px" />
   </Theme>
);

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

import Theme from "@quarkly/theme";
 
const theme = {
   breakpoints: {
       sm: [{ type: "max-width", value: 576 }],
       md: [{ type: "max-width", value: 768 }],
       lg: [{ type: "max-width", value: 992 }],
   },
   colors: {
       dark: "#04080C",
   },
   borders: {
       dark: "5px solid --colors-dark",
   },
};
export const MyComp = () => (
   <Theme>
       <Box
           md-bgc="--dark"
           border="--borders-dark"
           height="100px"
           width="100px"
       />
   </Theme>
);

يمكن العثور على رمز المصدر للمواضيع هنا .

تأثيرات


الفرق الرئيسي بين Atomize و Styled-System هو "التأثيرات". ما هو ولماذا هو مطلوب؟
دعونا نتخيل أنك تقوم بإنشاء مكون زر ، وتغيير لونه وحدوده ، ولكن كيفية تعيين الأنماط للمرور ، والتركيز ، وما إلى ذلك؟ هنا تأتي الآثار إلى الإنقاذ.

عند إنشاء مكون ، ما عليك سوى نقل الكائن بالتهيئة:

const MySuperButton = atomize.button({
 effects: {
   hover: ":hover",
   focus: ":focus",
   active: ":active",
   disabled: ":disabled",
 },
});

المفتاح هو البادئة في اسم الدعائم ، والقيمة هي محدد CSS. وهكذا ، أغلقنا الحاجة إلى جميع الفئات الزائفة.

الآن إذا حددنا بادئة التمرير لأي خاصية CSS ، فسيتم تطبيقها بتأثير معين. على سبيل المثال ، عند المرور فوق:

ReactDOM.render(<MySuperButton hover-bgc="blue" />, root);

يمكنك أيضًا دمج التأثيرات مع تعبيرات الوسائط:

ReactDOM.render(<MySuperButton md-hover-bgc="blue" />, root);

بعض الأمثلة


لتصور المعلومات أعلاه ، دعونا الآن نجمع بعض المكونات المثيرة للاهتمام. قمنا بإعداد مثالين:


في المثال الثاني ، استخدمنا معظم الوظائف ، بالإضافة إلى واجهة برمجة تطبيقات خارجية.

لكن هذا ليس كل شيء


الغرض الثاني من Atomize ، كما ذكرت أعلاه ، هو إنشاء عناصر واجهة تعامل في Quarkly بناءً على مكونات التفاعل المخصصة.

للقيام بذلك ، ما عليك سوى لف المكون الخاص بك في Atomize ووصف تكوينه حتى يتمكن Quarkly من فهم الخصائص التي يمكن تحريرها بشكل تفاعلي:

export default atomize(PokemonCard)(
 {
   name: "PokeCard",
   effects: {
     hover: ":hover",
   },
   description: {
     // past here description for your component
     en: "PokeCard — my awesome component",
   },
   propInfo: {
     // past here props description for your component
     name: {
       control: "input",
     },
   },
 },
 { name: "pikachu" }
);

تبدو حقول التكوين للمكون كما يلي:

  • التأثيرات - تحدد الفئات الزائفة للمتصفح (التمرير ، والتركيز ، وما إلى ذلك) ؛
  • الوصف - وصف المكون الذي سيظهر عندما يحوم المؤشر فوق اسمه ؛
  • propInfo - تكوين عناصر التحكم التي سيتم عرضها في اللوحة اليمنى (علامة التبويب props).

كيفية تحديد الدعائم التي سيتم عرضها على اللوحة اليمنى (علامة التبويب الدعائم):

propInfo: {
   yourCustomProps: { //  
       description: { en: "test" }, //    
       control: "input" //  
   }
}

خيارات التحكم الممكنة:

  • إدخال
  • تحديد
  • اللون
  • الخط
  • ظل
  • انتقال
  • تحول
  • منقي،
  • خلفية
  • رمز خانة الاختيار ،
  • رمز الراديو ،
  • مجموعة راديو
  • خانة الاختيار.

مثال آخر. أضفنا هنا مكوننا إلى النظام والآن يمكننا تحريره بشكل تفاعلي:


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

والآن المنافسة!


من أجل تسخين اهتمام المجتمع قليلاً بمعرفة أوثق مع Atomize ، قررنا اتباع المسار البسيط والمفهوم (مثل Atomize نفسه) - نحن نطلق مسابقة!

تتوفر جميع المعلومات حول الشروط والقواعد والجوائز على الموقع الرسمي للمسابقة.

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

All Articles