NahdaAIنهضة
Tailwind CSS • المستوى الرابع • الدرس 1

التخصيص وإضافة الكلاسات الخاصة (Customization & @apply)

العودة لفهرس المستوى

أهداف الدرس

  • توسيع الثيم الافتراضي بإضافة ألوان وخطوط في tailwind.config.js.
  • تجميع كلاسات Utility المكررة بـ @apply للحفاظ على نظافة القوالب.
  • تنظيم الكلاسات المخصصة داخل طبقات @layer components و @layer utilities.
  • إعادة استخدام الأنماط عبر المتغيرات (مثل: btn-sm, btn-md, btn-lg) لتنظيم نظام التصميم.

1. تنظيف وتجميع التنسيقات

عندما يتكرر زر أو بطاقة بشكل كبير في تطبيقك، يمكنك الاستعانة بالموجّه @apply لتجميع كلاسات Tailwind المتكررة في كلاس CSS مخصص ومختصر واحد.

css
/* globals.css */
@tailwind base;
@tailwind components;
@tailwind utilities;

@layer components {
  /* الأزرار الأساسية */
  .btn-primary {
    @apply bg-purple-600 hover:bg-purple-700 text-white font-bold
           px-6 py-3 rounded-none transition-all
           active:scale-95;
  }

  .btn-danger {
    @apply bg-rose-600 hover:bg-rose-700 text-white font-bold
           px-6 py-3 rounded-none transition-all
           active:scale-95;
  }

  /* البطاقات */
  .card {
    @apply bg-slate-800 border border-slate-700 rounded-none
           p-6 hover:border-purple-500/40 transition-all;
  }

  /* المدخلات */
  .input-field {
    @apply w-full bg-slate-800 border border-slate-700
           focus:border-purple-500 focus:ring-2 focus:ring-purple-500/20
           text-white px-4 py-3 rounded-none transition-all outline-none;
  }
}

/* الآن في أي مكون */
// <button class="btn-primary">حفظ</button>
// <button class="btn-danger">حذف</button>

2. تخصيص الثيم عبر tailwind.config.js

يمكنك توسيع الثيم الافتراضي لإضافة ألوان، خطوط، مسافات مخصصة لمشروعك.

javascript
// tailwind.config.js
module.exports = {
  content: ['./src/**/*.{js,jsx,ts,tsx}'],
  theme: {
    extend: {
      // ألوان مخصصة للعلامة التجارية
      colors: {
        brand: {
          50:  '#f5f3ff',
          500: '#8b5cf6',
          900: '#4c1d95',
        },
      },
      // خطوط مخصصة
      fontFamily: {
        display: ['Playfair Display', 'serif'],
      },
      // مسافات إضافية
      spacing: {
        '128': '32rem',
      },
      // حركات مخصصة
      animation: {
        'bounce-slow': 'bounce 3s infinite',
      },
    },
  },
  plugins: [],
};

3. متى تستخدم @apply ومتى تتجنبه؟

استخدم @apply عندما
  • يكون الزر/البطاقة متكررة بشكل كبير
  • ترغب بنظام تصميم موحد (Design System)
  • تحتاج لتوحيد الأنماط عبر المشروع
  • تعمل على مكونات JSX معقدة
تجنّب @apply عندما
  • الكلاس يُستخدم مرة أو مرتين فقط
  • تحتاج لتعديلات سياقية خاصة
  • تُضخّم حجم CSS بلا فائدة
  • تريد مرونة قصوى في التنسيق
التطبيق العملي المباشر

تحدي الدرس الأول: بناء نظام أزرار موحد

قم بالتعديل على الكود بداخل المحرر أدناه لتطبيق المتطلبات التالية:

  1. غلّف الكل في حاوية <div class="space-y-6 p-8">.
  2. أضف btn-primary (بنفسجي) و btn-secondary (رمادي) و btn-danger (أحمر) و btn-success (أخضر) في صف واحد بـ flex flex-wrap justify-center gap-3.
  3. أضف زر btn-ghost بخلفية شفافة bg-transparent hover:bg-purple-500/10 مع حدود border-2 border-purple-500/50.
  4. أضف 3 أزرار بأحجام مختلفة: btn-sm (text-xs, px-3 py-1.5) و btn-md (text-base) و btn-lg (text-lg, px-8 py-4).
  5. أضف بطاقة card بـ bg-slate-800 border border-slate-700 p-6 hover:border-purple-500/40 تحتوي على أيقونة دائرية.
  6. أضف حقل إدخال input-field بـ bg-slate-800 border border-slate-700 focus:border-purple-500 focus:ring-2 focus:ring-purple-500/20.
⏳ جارٍ تحميل المحرر التفاعلي...