استكشاف Tailwind CSS: إطار عمل CSS الموجه للمرافق وكيفية دمجه في مشاريعك
مقدمة إلى Tailwind CSS: ثورة في عالم تصميم الواجهات
تُعد لغة CSS حجر الزاوية في تصميم الويب، فهي تمنحنا مرونة لا تضاهى لإنشاء تجارب بصرية ساحرة. ومع ذلك، قد تتحول هذه المرونة إلى تحدٍ كبير إذا لم يتم التعامل معها بعناية، مما يؤدي إلى تعقيد الشيفرة وصعوبة إدارتها مع نمو المشروع. هنا يأتي دور Tailwind CSS ليقدم حلاً مبتكراً لهذه المعضلة، فكيف يمكن لهذا الإطار أن يمكننا من التحكم الكامل في أنماطنا؟
ما هو Tailwind CSS؟ وما الذي يميزه؟
Tailwind CSS هو إطار عمل CSS يعتمد مبدأ "المرافق أولاً" (utility-first). يقدم هذا الإطار كتالوجاً غنياً من فئات CSS الجاهزة والأدوات التي تمكنك من البدء في تصميم موقعك الإلكتروني أو تطبيقك بسهولة وفعالية. الهدف الأساسي من Tailwind هو تحرير المطورين من عبء التعامل مع الأنماط المتتالية (cascading styles) والقلق بشأن كيفية تجاوز تلك الأنماط المعقدة التي قد تتراكم وتصبح كابوساً في مشاريعهم.
لماذا يعتبر Tailwind CSS خياراً ممتازاً؟
يكمن تفرد Tailwind في توفيره لمجموعة واسعة من فئات CSS، حيث تركز كل فئة على استخدام محدد وواضح. فبدلاً من تعريف فئة مثل .btn تحتوي على مجموعة من خصائص CSS مباشرة، يتيح لك Tailwind تطبيق العديد من الفئات المساعدة مباشرة على العنصر، مثل لزر معين. أو يمكنك بناء فئة مخصصة مثل bg-blue-500 py-2 px-4 rounded.btn عن طريق تطبيق هذه الفئات المساعدة على هذا المحدد.
بينما يقدم Tailwind الكثير من الميزات المتقدمة، سنركز في هذا الدليل على الأساسيات لتمكينك من فهم جوهره وكيفية البدء في استخدامه.
الجزء الأول: إضافة Tailwind CSS إلى صفحة HTML ثابتة
سنبدأ بتطبيق Tailwind CSS مباشرة على صفحة HTML ثابتة. الهدف من ذلك هو التركيز على فهم آلية عمل الإطار نفسه دون تشتيت الانتباه بتعقيدات التطبيقات.
الخطوة 1: إنشاء صفحة HTML جديدة
ابدأ بإنشاء ملف HTML جديد. يمكنك استخدام أي محتوى تريده، ولكن لغرض التوضيح، سنستخدم محتوى عشوائي من موقع fillerama.io لجعل المحتوى أكثر جاذبية.

الخطوة 2: إضافة Tailwind CSS عبر CDN
على الرغم من أن Tailwind يوصي عادةً بالتثبيت عبر للحصول على الوظائف الكاملة، إلا أننا سنستخدم npmCDN في هذه المرحلة لفهم كيفية عمله أولاً. قم بإضافة رابط ملف CDN داخل وسم في مستند <head>HTML الخاص بك:
<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet">
بمجرد حفظ الصفحة وإعادة تحميلها، ستلاحظ أن جميع الأنماط الافتراضية قد اختفت! وهذا أمر متوقع. يتضمن Tailwind مجموعة من الأنماط الأولية (preflight styles) لإصلاح التناقضات بين المتصفحات المختلفة. فهو يضم الشهير ويبني عليه أنماطه الخاصة. لكن لا تقلق، سنتعلم الآن كيفية استخدام normalize.cssTailwind لإعادة إضافة أنماطنا وتخصيصها بالطريقة التي نريدها!

الخطوة 3: استخدام فئات Tailwind CSS لتنسيق صفحتك
بعد تثبيت Tailwind، أصبح لدينا القدرة على استخدام مكتبته الضخمة من الفئات المساعدة. لنبدأ بإضافة بعض الهوامش لجميع فقراتنا () وعناصر القوائم (<p> و <ol>). يمكننا القيام بذلك عن طريق إضافة فئة <ul> إلى كل عنصر على النحو التالي:.my-5
<p class="my-5">Bender, quit destroying the universe! Yeah, I do that with my stupidness. I never loved you. Moving along… Belligerent and numerous.</p>
يتبع اسم الفئة نمطاً ستلاحظه مع بقية الفئات المساعدة – تعني هامش (.my-5m) مطبق على المحور y بقيمة 5، والتي في حالة Tailwind، تستخدم وحدة rem، لذا تكون القيمة 5rem.

بعد ذلك، لنجعل عناويننا تبدو كعناوين حقيقية. بدءاً من وسم ، لنضف:h1
<h1 class="text-2xl font-bold mt-8 mb-5">
إليك ما يحدث هنا:
: يحدد حجم النص (text-2xlfont-size) إلى2xl. فيTailwind، تعادل2xlقيمة1.5rem.: يحدد سمك النص (font-boldfont-weight) إلىbold.: على غرارmt-8، سيحدد هذا الهامش العلوي (my-5margin-top) إلى8rem.: وسيحدد هذا الهامش السفلي (mb-5margin-bottom) إلى5rem.

مع إضافة هذه الفئات إلى ، دعنا نطبق نفس الفئات تماماً على بقية عناصر العناوين، ولكن مع تقليل حجم الخط كلما نزلنا في القائمة، بحيث تبدو كالتالي:h1
h2:text-xlh3:text-lg

الآن لنجعل عناصر القائمة تبدو كقوائم حقيقية. بدءاً من قائمتنا غير المرتبة ()، لنضف هذه الفئات:<ul>
<ul class="list-disc list-inside my-5 pl-2">
إليك ما نضيفه:
: يحدد نوع نمط القائمة (list-disclist-style-type) إلىdisc(علامات التعداد النقطي).: يحدد موضع علامات القائمة باستخدامlist-insidelist-style-positionإلىinside.: يحدد الهامش على المحورmy-5yإلى5rem.: يحدد الحشو الأيسر (pl-2padding-left) إلى2rem.
ثم يمكننا تطبيق نفس الفئات تماماً على قائمتنا المرتبة ()، باستثناء أننا نريد تغيير نوع النمط إلى <ol> بدلاً من list-decimal، حتى نرى الأرقام نظراً لأنها قائمة مرتبة.list-disc
<ol class="list-decimal list-inside my-5 pl-2">
وهكذا، أصبح لدينا قوائمنا منسقة!

أخيراً، لنجعل محتوانا أسهل في القراءة عن طريق تحديد أقصى عرض وتوسيط المحتوى. في وسم ، أضف ما يلي:<body>
<body class="max-w-4xl mx-auto">
ملاحظة: عادةً، لا يُفضل تطبيق هذه الفئات مباشرة على وسم نفسه. بدلاً من ذلك، يمكنك تغليف جميع محتوياتك بوسم <body> وتطبيق هذه الفئات عليه. ولكن لغرض التوضيح وفهم كيفية عمل <main>Tailwind، سنستخدم هذه الطريقة. لا تتردد في إضافة وسم مع تلك الفئات إذا كنت تفضل ذلك!<main>
وبهذا، تكون صفحتنا جاهزة!

الخطوة 4: إضافة زر ومكونات أخرى
في الجزء الأخير من مثالنا الثابت، لنضف زراً. تكمن الحيلة في Tailwind في أنه لا يوفر عمداً فئات مكونات جاهزة مسبقاً، وذلك لأن المطورين غالباً ما يحتاجون إلى تجاوز هذه المكونات لجعلها تبدو بالطريقة التي يريدونها. هذا يعني أننا سنضطر إلى إنشاء مكوناتنا الخاصة باستخدام الفئات المساعدة!
أولاً، لنضف زراً جديداً. في مكان ما في الصفحة، أضف المقتطف التالي. سأضيفه أسفل الفقرة الأولى () مباشرة:<p>
<button>Party with Slurm!</button>

ستلاحظ، تماماً مثل جميع العناصر الأخرى، أنه غير منسق. ومع ذلك، إذا حاولت النقر عليه، ستلاحظ أنه لا يزال يحتفظ بإجراءات النقر. لذا، لنجعله يبدو كزر. لنضف الفئات التالية:
<button class="text-white font-bold bg-purple-700 hover:bg-purple-800 py-2 px-4 rounded">Party with Slurm!</button>
إليك تفصيل لما يحدث:
: نحدد لون النص إلى الأبيض.text-white: نحدد سمك النص (font-boldfont-weight) إلىbold.: نحدد لون خلفية الزر إلى الأرجواني بدرجةbg-purple-700700. القيمة700نسبية للألوان الأخرى المعرفة كأرجواني، يمكنك العثور على هذه القيم في صفحة توثيق الألوان الخاصة بـTailwind.: عند مرور المؤشر فوق الزر، نحدد لون الخلفية إلى الأرجواني بدرجةhover:bg-purple-800800. يوفرTailwindهذه الفئات المساعدة التي تسمح لنا بتحديد أنماط تفاعلية بسهولة باستخدام معدلات مثلوhoverوfocus.active: نحدد الحشو على المحورpy-2yإلى2rem.: نحدد الحشو على المحورpx-4xإلى4rem.: نقوم بتقريب زوايا العنصر عن طريق تحديدroundedborder-radius. معTailwind، يحدد قيمةborder-radiusإلى.25rem.
وبكل هذا، أصبح لدينا زرنا جاهزاً!

يمكنك تطبيق هذه المنهجية على أي مكون آخر ترغب في بنائه. على الرغم من أنها عملية يدوية، إلا أننا سنكتشف كيف يمكننا تسهيل هذه العملية عند البناء في مشاريع أكثر ديناميكية مثل تلك التي تعتمد على React.
الجزء الثاني: إضافة Tailwind CSS إلى تطبيق React
لاستخدام أكثر واقعية، سنقوم بإضافة Tailwind CSS إلى تطبيق تم إنشاؤه باستخدام . أولاً، سنستعرض الخطوات التي تحتاجها لإضافة Create React AppTailwind إلى مشروعك باستخدام تثبيت جديد لـ ، ثم سنستخدم محتوانا من المثال الأخير لإعادة إنشائه في Create React AppReact.
الخطوة 1: إعداد تطبيق React جديد
لن نفصل هذه الخطوة كثيراً. الفكرة الأساسية هي أننا سنقوم بإنشاء تطبيق React جديد باستخدام . للبدء، يمكنك اتباع التوجيهات من وثائق Create React AppReact الرسمية: https://reactjs.org/docs/create-a-new-react-app.html
وبمجرد تشغيل خادم التطوير الخاص بك، يجب أن ترى التطبيق الآن!

أخيراً، دعنا نرحل جميع محتوانا القديم إلى تطبيقنا. للقيام بذلك، انسخ كل شيء داخل وسم من مثالنا الثابت والصقه داخل وسم <body> في مشروع <div className="App">React الجديد.

بعد ذلك، قم بتغيير جميع سمات من المحتوى الذي لصقناه إلى class=" بحيث تستخدم سمات className="React الصحيحة:

وأخيراً، استبدل على وسم className App الخاص بنا بالفئات التي استخدمناها على وسم <div> الثابت الخاص بنا.<body>

بمجرد حفظ تغييراتك وإعادة تشغيل الخادم، سيبدو الأمر جيداً بشكل مخادع. يتضمن React بعض الأنماط الأساسية بنفسه، لذا بينما يبدو الأمر جيداً، فإننا لا نستخدم Tailwind بعد. لذا، لنبدأ بتثبيته!

الخطوة 2: تثبيت Tailwind في تطبيق React الخاص بك
هناك بعض الخطوات التي سنحتاج إلى المرور بها لجعل Tailwind يعمل في تطبيقنا. تأكد من اتباع هذه الخطوات بعناية لضمان تكوينه بشكل صحيح.
أولاً، لنضف تبعياتنا:
yarn add tailwindcss postcss-cli autoprefixer
# أو
npm install tailwindcss postcss-cli autoprefixer
وفقاً لوثائق Tailwind، نحتاج إلى معالجة أنماطنا بحيث يمكن إضافتها بشكل صحيح إلى مسار البناء الخاص بنا. لذا في الأمر أعلاه، نضيف:
: حزمةtailwindcssTailwindالأساسية.: يستخدمpostcss-cliCreate React Appبالفعلpostcss، لكننا نحتاج إلى تكوينTailwindليكون جزءاً من عملية البناء هذه وتشغيل معالجته الخاصة.: لا يتضمنautoprefixerTailwindبادئات البائع (vendor prefixes)، لذا نريد إضافةautoprefixerللتعامل مع هذا الأمر نيابة عنا. يعمل هذا كجزء من تكوينpostcssالخاص بنا.
سنضيف أيضاً تبعيتين تطويريتين تجعلان العمل مع شيفرتنا أسهل:
yarn add concurrently chokidar-cli -D
# أو
npm install concurrently chokidar-cli --save-dev
: حزمة تتيح لنا إعداد القدرة على تشغيل أوامر متعددة في وقت واحد. هذا مفيد لأننا سنحتاج إلى مراقبة كل من الأنماط وتطبيقconcurrentlyReactنفسه.: يتيح لنا مراقبة الملفات وتشغيل أمر عند التغيير. سنستخدم هذا لمراقبة ملفchokidar-cliCSSالخاص بنا وتشغيل عملية بناءCSSعند التغيير.
بعد ذلك، لنقم بتكوين postcss، لذا قم بإنشاء ملف جديد في جذر مشروعك يسمى وقم بتضمين ما يلي:postcss.config.js
// داخل postcss.config.js
module.exports = {
plugins: [
require('tailwindcss'),
require('autoprefixer')
],
};
سيضيف هذا مكوني و Tailwind CSS الإضافيين إلى تكوين Autoprefixerpostcss الخاص بنا. مع تكويننا، نحتاج إلى تضمينه كجزء من عمليات البناء والمراقبة. داخل ملف ، أضف التعريفات التالية إلى خاصية package.json الخاصة بك:scripts
"build:css": "tailwind build src/App.css -o src/index.css",
"watch:css": "chokidar 'src/App.css' -c 'npm run build:css'",
بالإضافة إلى ذلك، قم بتعديل نصوص و start لتضمين تلك الأوامر الآن:build
"start": "concurrently -n Tailwind,React 'npm run watch:css' 'react-scripts start'",
"build": "npm run build:css && react-scripts build",
مع جاهزية تكويننا، دعنا نحاول إعادة أنماطنا إلى حيث كانت عندما توقفنا عن المثال الثابت. داخل ملف ، استبدل المحتوى بالكامل بما يلي:App.css
@tailwind base;
@tailwind components;
@tailwind utilities;
سيقوم هذا باستيراد الأنماط الأساسية والمكونات وفئات المرافق الخاصة بـ Tailwind التي تسمح له بالعمل كما تتوقع. يمكننا أيضاً إزالة استيراد من ملف App.css الخاص بنا لأنه يتم حقنه الآن مباشرة في ملف App.js الخاص بنا. لذا، قم بإزالة هذا السطر:index.css
import './App.css';
بمجرد الانتهاء، يمكنك إعادة تشغيل خادم التطوير الخاص بك! إذا كان قد بدأ بالفعل، فتأكد من إعادة تشغيله حتى تسري جميع تغييرات التكوين. والآن يجب أن تبدو الصفحة تماماً كما كانت في مثالنا الثابت!

الخطوة 3: إنشاء فئة مكون زر جديدة باستخدام Tailwind
لا يأتي Tailwind مع فئات مكونات جاهزة، ولكنه يجعل من السهل إنشائها! سنستخدم زرنا الذي أنشأناه بالفعل كمثال لإنشاء مكون جديد. سنقوم بإنشاء فئة جديدة بالإضافة إلى معدل لون btn لتحقيق ذلك.btn-purple
أول شيء سنفعله هو فتح ملف حيث سننشئ فئتنا الجديدة. داخل هذا الملف، لنضف:App.css
.btn {
@apply font-bold py-2 px-4 rounded;
}
إذا تذكرت من HTML الخاص بنا، فإننا نضمّن بالفعل نفس الفئات في عنصر الخاص بنا. يتيح لنا <button>Tailwind "تطبيق" أو تضمين الأنماط التي تشكل هذه الفئات المساعدة في فئة أخرى، في هذه الحالة، فئة . والآن بعد أن أنشأنا هذه الفئة، دعنا نطبقها على زرنا:.btn
<button className="btn text-white bg-purple-700 hover:bg-purple-800">Party with Slurm!</button>
وإذا فتحنا صفحتنا، يمكننا أن نرى أن زرنا لا يزال يبدو كما هو. إذا فحصنا العنصر، يمكننا أن نرى فئة الجديدة التي تم إنشاؤها بهذه الأنماط..btn

بعد ذلك، لننشئ معدلاً للألوان. على غرار ما فعلناه للتو، سنضيف القواعد التالية:
.btn-purple {
@apply bg-purple-700 text-white;
}
.btn-purple:hover {
@apply bg-purple-800;
}
هنا، نضيف لون الخلفية ولون النص إلى فئة الزر. ونطبق أيضاً لون زر أغمق عند مرور المؤشر فوق الزر. سنحتاج أيضاً إلى تحديث زر HTML الخاص بنا لتضمين فئتنا الجديدة وإزالة الفئات التي طبقناها للتو:
<button className="btn btn-purple">Party with Slurm!</button>
ومع هذا التغيير، لا يزال بإمكاننا رؤية أنه لم يتغير شيء ولدينا فئة زرنا الجديدة!

تطبيق هذه المفاهيم على المزيد من المكونات
من خلال هذا الدليل، تعلمنا كيفية إنشاء فئة مكون جديدة باستخدام توجيه في @applyTailwind. سمح لنا هذا بإنشاء فئات قابلة لإعادة الاستخدام تمثل مكوناً مثل الزر. يمكننا تطبيق هذا على أي عدد من المكونات في نظام التصميم الخاص بنا. على سبيل المثال، إذا أردنا دائماً عرض قوائمنا بالطريقة التي أعددناها هنا، يمكننا إنشاء فئة تمثل قائمة غير مرتبة مع فئات .list-ulTailwind المساعدة المطبقة عليها.list-disc list-inside my-5 pl-2
الخلاصة التقنية
يُعد Tailwind CSS نقلة نوعية في منهجية تصميم الواجهات، حيث يقدم بديلاً قوياً لإطارات عمل CSS التقليدية. بفضل فلسفته القائمة على "المرافق أولاً"، يمنح المطورين سيطرة لا مثيل لها على كل تفصيلة بصرية، مما يقلل من الحاجة لكتابة CSS مخصص ويحد من مشاكل تضارب الأنماط. سواء كنت تبني صفحة HTML بسيطة أو تطبيق React معقداً، فإن Tailwind يوفر الأدوات اللازمة لبناء واجهات مستخدم متسقة وجميلة بكفاءة عالية. إن القدرة على إنشاء مكونات قابلة لإعادة الاستخدام باستخدام توجيه تزيد من إنتاجية المطورين وتضمن سهولة الصيانة والتوسع. ومع ذلك، يتطلب الأمر بعض الوقت للتعود على طريقة التفكير "الموجهة للمرافق"، ولكن المكافأة هي شيفرة @applyCSS أنظف وأكثر قابلية للإدارة.