طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 242 · أطر الويب
الدرس 8 · الوحدة 3: تنفيذ التصميم المتجاوب

Tailwind CSS: التنسيق بالأصناف الجاهزة

تنسيق سريع ومتسق دون مغادرة المكوّن. ⏱ نحو 30 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تشرح فكرة الأصناف الخدمية وتقارنها بـ CSS و Bootstrap.
  • تستخدم أصناف المسافات والألوان والنص والتخطيط والحالات.
  • تبني مكوّنات React بأشكال متعددة عبر الخصائص.
  • تثبّت Tailwind في مشروع Vite.

١فكرة «الأصناف الخدمية»

في مقرر 131 كتبت CSS في ملف منفصل بأصناف تسميها بنفسك (.card)، ثم جرّبت Bootstrap بمكوّناته الجاهزة (.btn .btn-primary). أما Tailwind CSS فيقدّم أصنافًا صغيرة جدًّا، كل صنف يفعل شيئًا واحدًا، وتركّبها مباشرة في JSX:

CSS عاديBootstrapTailwind
الأسلوبتكتب القواعد بنفسكمكوّنات جاهزة الشكلأصناف صغيرة تركّبها
مثال زر.buy { padding:8px; … }class="btn btn-primary"className="px-4 py-2 rounded-lg bg-sky-600 text-white"
التخصيصكاملمحدود بالسمةكامل دون مغادرة JSX
حجم CSS النهائيحسب ما تكتبكبيرصغير: يولّد فقط الأصناف التي استخدمتها
export default function App() {  return (    <div className="max-w-sm p-4 rounded-2xl bg-white shadow-lg border border-slate-200">      <h2 className="text-xl font-bold text-slate-800">قهوة عربية</h2>      <p className="text-slate-500 mt-1">محمّصة يوميًّا في المدينة المنورة.</p>      <div className="flex items-center justify-between mt-4">        <span className="text-2xl font-extrabold text-emerald-600">35 ﷼</span>        <button className="px-4 py-2 rounded-lg bg-sky-600 text-white hover:bg-sky-700">أضف للسلة</button>      </div>    </div>  );}

مرّر الفأرة على الزر: hover:bg-sky-700 يغيّر لونه عند المرور. لا ملف CSS في هذا المثال إطلاقًا.

٢قاموس الأصناف الأساسية

أسماء الأصناف منطقية، وتعتمد مقياسًا ثابتًا: الرقم 1 = 0.25rem (4 بكسل)، فـ p-4 = 16 بكسل:

المجالأمثلةالمعنى
المسافاتp-4 px-2 py-1 m-3 mt-2 gap-4حشو وهامش وفجوة: p حشو، m هامش، x أفقي، y رأسي، t أعلى
المسافات المنطقية (للعربية)ps-4 pe-2 ms-autos بداية السطر و e نهايته؛ تعمل صحيحًا مع RTL
الألوانbg-sky-100 text-slate-800 border-emerald-500لون + درجة من 50 (فاتح) إلى 950 (داكن)
النصtext-sm text-xl font-bold text-centerالحجم والوزن والمحاذاة
الحدودborder rounded-lg rounded-full shadow-mdإطار وزوايا وظل
التخطيطflex items-center justify-between grid grid-cols-3Flexbox و Grid كما في CSS
الحالاتhover:bg-sky-700 focus:ring-2 disabled:opacity-50تنسيق عند المرور أو التركيز أو التعطيل
const levels = [  { name: 'مبتدئ', color: 'bg-emerald-100 text-emerald-800' },  { name: 'متوسط', color: 'bg-amber-100 text-amber-800' },  { name: 'متقدم', color: 'bg-rose-100 text-rose-800' },]; export default function App() {  return (    <div className="flex flex-wrap gap-2 p-2">      {levels.map(l => (        <span key={l.name} className={'px-3 py-1 rounded-full text-sm font-semibold ' + l.color}>          {l.name}        </span>      ))}    </div>  );}

٣Tailwind و React: الأصناف حسب الحالة والخصائص

قوة Tailwind تظهر مع المكوّنات: الصنف يُبنى من الخصائص والحالة. هذا زر واحد بأشكال متعددة:

import { useState } from 'react'; const styles = {  primary: 'bg-sky-600 text-white hover:bg-sky-700',  danger:  'bg-rose-600 text-white hover:bg-rose-700',  ghost:   'bg-transparent text-slate-700 border border-slate-300 hover:bg-slate-100',}; function Button({ variant = 'primary', children, ...rest }) {  return (    <button className={'px-4 py-2 rounded-lg font-semibold disabled:opacity-40 ' + styles[variant]} {...rest}>      {children}    </button>  );} export default function App() {  const [on, setOn] = useState(false);  return (    <div className="flex flex-wrap gap-2 p-2 items-center">      <Button onClick={() => setOn(!on)}>{on ? 'إيقاف' : 'تشغيل'}</Button>      <Button variant="danger">حذف</Button>      <Button variant="ghost" disabled>معطّل</Button>      <span className={'w-4 h-4 rounded-full ' + (on ? 'bg-emerald-500' : 'bg-slate-300')}></span>    </div>  );}

...rest يمرر بقية الخصائص (onClick و disabled) إلى الزر الحقيقي. مكوّن واحد، وكل الأزرار في التطبيق متسقة الشكل.

٤التثبيت في مشروع Vite

  1. ثبّت الحزمتين: npm install tailwindcss @tailwindcss/vite
  2. أضف الإضافة في vite.config.js.
  3. في أول ملف CSS الرئيسي: @import "tailwindcss";
  4. شغّل npm run dev واستخدم الأصناف في JSX.
import { defineConfig } from 'vite';import react from '@vitejs/plugin-react';import tailwindcss from '@tailwindcss/vite'; export default defineConfig({  plugins: [react(), tailwindcss()],});

هذه خطوات الإصدار 4 من Tailwind. والإصدارات تتغير؛ فإن اختلفت الخطوات عند تثبيتك فارجع إلى صفحة التثبيت الرسمية لـ Tailwind مع Vite. وفي المختبر نحمّل Tailwind داخل المعاينة مباشرة، فتعمل الأصناف فورًا.

٥جرّب بنفسك

🧪 مختبر Reactغيّر الأصناف وشاهد النتيجة فورًا.

توقّع وتحقّق

ماذا يعني الصنف p-4 ؟

4 × 0.25rem.

أي صنف يعمل صحيحًا في العربية والإنجليزية؟

s = start.

hover:bg-sky-700 يطبّق اللون:

حالة hover.

لماذا CSS الناتج من Tailwind صغير؟

يفحص الكود.

الخلاصة

تحدٍّ برمجي: بطاقة دورة بـ Tailwind

سهل

نسّق بطاقة دورة تدريبية بأصناف Tailwind فقط، بلا CSS ولا style.

المطلوب:
  • البطاقة <div id="card"> بحشو p-6 وزوايا rounded-xl وخلفية bg-white وظل shadow-md.
  • العنوان <h2>أطر الويب</h2> بحجم text-2xl ووزن font-bold.
  • شارة <span id="tag">3 ساعات</span> بخلفية bg-emerald-100 ونص text-emerald-800 وزوايا rounded-full.
  • لا تستخدم السمة style.
👀 اعرض الناتج المطلوب (وجرّبه)
✓ التحقق الآلي من حلّك:
  • الكود يعمل بلا أخطاء في Console
  • البطاقة بحشو 24px
  • البطاقة بزوايا مستديرة وظل
  • العنوان كبير وعريض
  • الشارة خضراء فاتحة ومستديرة
  • لا تستخدم style

💡 تلميح 1
الأصناف كلها مذكورة في المطلوب؛ ضعها في className.
💡 تلميح 2
rounded-full للشارة يجعل زواياها دائرية كاملة.

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

export default function App() {  return (    <div id="card" className="p-6 rounded-xl bg-white shadow-md">      <h2 className="text-2xl font-bold">أطر الويب</h2>      <span id="tag" className="px-3 py-1 rounded-full bg-emerald-100 text-emerald-800">3 ساعات</span>    </div>  );}
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس